forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Радиус среза круга (http://forum.boolean.name/showthread.php?t=17528)

radiobutton 17.11.2012 00:36

Ответ: Радиус среза круга
 
Цитата:

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

Цитата:

Сообщение от dsd (Сообщение 243827)
А вот нет, я в виду имел уравнение окружности и прямой, и дальше искал пересечение.

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 - координаты точки пересечения перпендикуляра проведенного из центра окружности к секущей.

WISHMASTER35 19.11.2012 02:31

Ответ: Радиус среза круга
 
Вложений: 1
Цитата:

Сообщение от radiobutton (Сообщение 243833)
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);
}

Но не работает, хотя теоретически должно работать.

radiobutton 19.11.2012 06:08

Ответ: Радиус среза круга
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 244078)
Это я так понимаю синяя точка на моем рисунке?

да.
Но если известна длина красной линии, то все проще. По той формуле, что в самом начале написал.

Цитата:

Сообщение от WISHMASTER35 (Сообщение 244078)
А вот если из центра эллипса ведет вектор, то как определить расстояние от центра до края эллипса в этом направлении?
Пытался так:
Код:

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;
}

WISHMASTER35 19.11.2012 21:22

Ответ: Радиус среза круга
 
И еще в конце корень надо было вычислить)
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 учесть.

radiobutton 20.11.2012 00:28

Ответ: Радиус среза круга
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 244186)
И еще в конце корень надо было вычислить)

да забыл +)

Цитата:

Сообщение от WISHMASTER35 (Сообщение 244186)
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, все ок. Не нужно учитывать.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot