Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2012, 09:47   #1
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
Радость Круг касающий круга.

Перезалил.

Здравствуйте. Знаю что немножко не туда пишу. Но может поможете.

Программа должна нарисовать два круга. Радиусы известны.
Один круг маленький другой большой они вот должны касаться.


Проблема начинается с маленьким кругом. По идеи что бы его нарисовать нужно знать его координаты. Координатами круга в данном случае является центр окружности.

Координаты маленького круга по X найти легко, а вот по Y не как не могу додуматься. Спасибо за внимание.

Последний раз редактировалось WizarD.89; 26.01.2012 в 16:23.
WizarD.89 вне форума Ответить с цитированием
Старый 26.01.2012, 11:01   #2
Mahin
Пользователь
 
Регистрация: 18.11.2009
Сообщений: 39
По умолчанию

Моё такое мнение, что круги нужно строить по координатам центра, тогда и проблем никаких
Mahin вне форума Ответить с цитированием
Старый 26.01.2012, 11:41   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Уравнение окружности можешь взять здесь.

http://ru.wikipedia.org/wiki/%D0%9E%...81%D1%82%D1%8C

Центр большой окружности тебе известен. Координаты точки касания тебе известны, как я понял (ну, высчитать легко). Задача сводится к решению системы из 2х уравнений окружностей. Когда решишь - получишь центр маленькой окружности. Потом сможешь найти свою базовую точку, в принципе, тоже очевидно.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 26.01.2012, 16:21   #4
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
По умолчанию

Mahin так и сделал. стало проще. но все равно не получается.

sVasilich вашим способом не очень получается. Если вам не составит труда решите быстренько. Спасибо.
WizarD.89 вне форума Ответить с цитированием
Старый 26.01.2012, 16:57   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Код:
x,y - коорд. точки касания

x0,y0 - искомые координаты (центр малой окружности)

R - радиус большой окружности

r - радиус малой окружности

X0,Y0 - координаты центра большой окружности

Окружности касаются в точке (x,y) если верно равенство:
(x-x0)^2+(y-y0)^2-r^2=(x-X0)^2+(y-Y0)^2-R^2
Из последнего уравнения найти x0 и y0. Как решать расскажет гугл. Формулу проверь, мог ошибиться.

Цитата:
решите быстренько
http://programmersforum.ru/showthread.php?t=34061
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 27.01.2012, 19:08   #6
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
По умолчанию

sVasilich

центр окружности нашел. через систему уравнений окружности. получилась формула для координаты центра малой окружности x0=-r; y=sqrt(r*r-R*R-2*R*x0-x0*x0);
спасибо.

Теперь нужно найти координаты точки касания окружностей. Не знаю в каком направлении думать. Пробовал с уравнениями окружностей, но что-то не получилось.
WizarD.89 вне форума Ответить с цитированием
Старый 27.01.2012, 21:21   #7
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Что-то я не понял. Я предполагал что известны центр большой окружности и точка касания:

Цитата:
(x-x0)^2+(y-y0)^2-r^2=(x-X0)^2+(y-Y0)^2-R^2
Здесь x и y - координаты точки касания. Не совсем понятно как у тебя без их участия формулы получились...

Поясни, как ты задаёшь в каком месте должны касаться окружности?

Если одна координата есть, то по этой же формуле можно найти вторую...

Может я не правильно условие понял...
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 28.01.2012, 15:41   #8
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
По умолчанию

sVasilich

Программа должна рисовать две окружности. Заданны произвольные радиусы. Условие что бы маленькая окружность касалась большого круга и диаметра как показано на рисунке. В рисунке показаны различные варианты радиуса окружностей для более лучшего понимания задачи.


По условию видно что r не может больше чем R/2, иначе не будет касания большой окружности и диаметра как показано на рисунке.



Для решения данной задачи нужно найти координаты маленькой окружности. Я вывел чудом формулу.помощью системы уравнений окружности.



Координаты большой окружности 0,0. То есть это начало координат. На декартовую систему координат нарисованная в самом низу не обращать внимания. потом легко будет перенести на нижнюю систему координат.

R, r , x0=-r известны

x,y, y0 не известны.


Так как не известны x,y;(координаты точки касания)
я решил взял случай в котором радиус маленькой окружности будет максимальной величины.
То есть r=R/2.
вот как тут. (Рисунок первый)



и взял их точки касания. Не трудно заметить что они будет равны x=-R,y=0 и подставил в уравнение.

Теперь x,y; типа известны. Вывел формулу и она оказалось рабочей для любых r<=R/2. Нашел y0;


Теперь координаты маленького круга известны. Они вычисляются по формуле x0=-r; y0=sqrt(2*R*r-R*R) И программа рисует окружности как надо


Следующая поставленная задача состоит в нахождении x,y то есть координаты точки касания окружностей.

Теоретически можно таким же образом найти x,y. Только тут две не известные координаты и все гораздо сложней. Теперь y0,x0,r,R известны; x,y не известны. 20 раз выводил формулу с нуля. И нет не работает

Последний раз редактировалось WizarD.89; 28.01.2012 в 18:48.
WizarD.89 вне форума Ответить с цитированием
Старый 28.01.2012, 20:03   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Так чтоли надо? Управление стрелками влево-вправо и вверх-вниз.

UPD. Даже так (логика получения формул изображена на картинке)

Добавил такую функцию (простой WinAPI + GDI проект):
Код:
void DrawCircle(HDC hdc, int radius, int cx, int cy)
{
	Ellipse(hdc, cx - radius, cy - radius, cx + radius, cy + radius);
}
которая рисует круг с центром (cx, cy) и радиусом radius.
Код:
// Большой круг
DrawCircle(hdc, r1, cx, cy);
// Маленький круг
DrawCircle(hdc, r2, cx + (r1-r2)*sin(alpha), cy + (r1-r2)*cos(alpha));
// Точка пересечения
DrawCircle(hdc, 2, cx + r1*sin(alpha), cy + r1*cos(alpha));
всё дело в синусах, гипотенузах и противолежащих катетах.
Изображения
Тип файла: png Снимок.PNG (19.6 Кб, 46 просмотров)
Вложения
Тип файла: zip rounds.zip (35.7 Кб, 10 просмотров)

Последний раз редактировалось pu4koff; 28.01.2012 в 22:31.
pu4koff вне форума Ответить с цитированием
Старый 28.01.2012, 23:46   #10
WizarD.89
Форумчанин
 
Аватар для WizarD.89
 
Регистрация: 02.12.2010
Сообщений: 160
По умолчанию

pu4koff не так.

Всем спасибо за внимание. я сделал что хотел вот могу даже программу выставить.

Завтра напишу как вычислил координаты касания окружностей.

в программме
нужно вести R большой круга.
и r маленького. r не должно быть больше чем R/2
Вложения
Тип файла: zip окружности.zip (19.1 Кб, 9 просмотров)
WizarD.89 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение круга:) mitmikha Паскаль, Turbo Pascal, PascalABC.NET 2 12.04.2011 12:11
Площадь круга sturz Помощь студентам 20 23.01.2011 11:07
вписание круга в ромб !? Weyner Помощь студентам 2 21.12.2010 21:53
Отрисовка круга в OpenGl Oburec Мультимедиа в Delphi 1 04.07.2009 15:22
Пересечение прямой и круга CoGnaC Паскаль, Turbo Pascal, PascalABC.NET 8 11.03.2008 17:01