Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 17.11.2012, 00:36   #16
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Радиус среза круга

Сообщение от impersonalis Посмотреть сообщение
Если не ошибаюсь, в выводе произошло смешение y как координаты и как величины перпендикуляра. А так - упрощение даёт похожий результат (проверь).
Сообщение от dsd Посмотреть сообщение
А вот нет, я в виду имел уравнение окружности и прямой, и дальше искал пересечение.
y*y + x*x - r*r = 0

x = +-sqrt(r*r - y*y)

length = sqrt(r*r - y*y) - ( - sqrt(r*r - y*y)) = 2 * sqrt (r*r - y*y)

Где y это координата на оси Y. С учетом, что центр окружности в (0,0).

И формула работает только если секущая паралельная оси X.
Вообщем ето только частный случай.

Если секущая не паралельна оси X, тогда length будит только длиной проекции секущей на ось X. Чтобы найти длину самой секущей, нужно также найти длину проекции секущей на ось Y.
Также нужно улучшить формулу, чтобы окружность могла быть не только в (0,0).

В итоге получим

lenghtX = 2 * sqrt (r*r - (y-y0)*(y-y0))
lenghtY = 2 * sqrt (r*r - (x-x0)*(x-x0))
lenght = sqrt (lenghtX*lenghtX + lenghtY*lenghtY) =
= sqrt (4* (r*r - (y-y0)*(y-y0)) + 4 * (r*r - (x-x0)*(x-x0)) )
= 2 * sqrt( 2*r*r - (y-y0)*(y-y0) - (x-x0)*(x-x0) )

lenght = 2 * sqrt( 2*r*r - (y-y0)*(y-y0) - (x-x0)*(x-x0) )

Где
r - радиус.
x0, y0 - координаты центра окружности.
x,y - координаты точки пересечения перпендикуляра проведенного из центра окружности к секущей.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
WISHMASTER35 (19.11.2012)
Старый 19.11.2012, 02:31   #17
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Радиус среза круга

Сообщение от radiobutton Посмотреть сообщение
x,y - координаты точки пересечения перпендикуляра проведенного из центра окружности к секущей.
Это я так понимаю синяя точка на моем рисунке?
А вот если из центра эллипса ведет вектор, то как определить расстояние от центра до края эллипса в этом направлении?
Пытался так:
dir.setLength(radX);
float len = distance(dir, radX, radY);
dir.div(len);

private static float distance(Vector2f point, float a, float b) {
   //1 - на краю эллипса. 0 - в центре
   return (point.x*point.x) / (a*a) + (point.y*point.y) / (b*b);
}
Но не работает, хотя теоретически должно работать.
Миниатюры
Нажмите на изображение для увеличения
Название: circle.png
Просмотров: 813
Размер:	1.8 Кб
ID:	18068  
(Offline)
 
Ответить с цитированием
Старый 19.11.2012, 06:08   #18
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Радиус среза круга

Сообщение от WISHMASTER35 Посмотреть сообщение
Это я так понимаю синяя точка на моем рисунке?
да.
Но если известна длина красной линии, то все проще. По той формуле, что в самом начале написал.

Сообщение от WISHMASTER35 Посмотреть сообщение
А вот если из центра эллипса ведет вектор, то как определить расстояние от центра до края эллипса в этом направлении?
Пытался так:
dir.setLength(radX);
float len = distance(dir, radX, radY);
dir.div(len);

private static float distance(Vector2f point, float a, float b) {
   //1 - на краю эллипса. 0 - в центре
   return (point.x*point.x) / (a*a) + (point.y*point.y) / (b*b);
}
Но не работает, хотя теоретически должно работать.
Попробуй так.

private static float distance(Vector2f point, float a, float b) {
float c = point.y / point.x;
float x = (a*b) / Mathf.sqrt(b*b + c*c*a*a);
float y = c*x;

return x*x + y*y;
}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
WISHMASTER35 (19.11.2012)
Старый 19.11.2012, 21:22   #19
WISHMASTER35
Бывалый
 
Аватар для WISHMASTER35
 
Регистрация: 21.12.2008
Адрес: UA
Сообщений: 878
Написано 105 полезных сообщений
(для 357 пользователей)
Ответ: Радиус среза круга

И еще в конце корень надо было вычислить)
private static float distance(Vector2f dir, float a, float b) {
float c = dir.y / dir.x;
float x = (float) ((a * b) / Math.sqrt(b * b + c * c * a * a));
float y = c * x;
return (float)Math.sqrt( x * x + y * y );
}
только надо как-то когда dir.y == 0 учесть.
(Offline)
 
Ответить с цитированием
Старый 20.11.2012, 00:28   #20
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Радиус среза круга

Сообщение от WISHMASTER35 Посмотреть сообщение
И еще в конце корень надо было вычислить)
да забыл +)

Сообщение от WISHMASTER35 Посмотреть сообщение
private static float distance(Vector2f dir, float a, float b) {
float c = dir.y / dir.x;
float x = (float) ((a * b) / Math.sqrt(b * b + c * c * a * a));
float y = c * x;
return (float)Math.sqrt( x * x + y * y );
}
только надо как-то когда dir.y == 0 учесть.
Если dir.y = 0 , то растояние будит равно радиусу по оси X, все ок. Не нужно учитывать.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:29.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com