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)

WISHMASTER35 16.11.2012 20:36

Радиус среза круга
 
Вложений: 1
Как определить радиус круга в точке [0;y]?
Пробовал так
Код:

private float GetRadius(float y) {
  // y = [0, radius]
  float k = y/radius;
  k = (float) Math.cos( Math.toRadians(k*90) );
  return radius*k;
}

Но функция выдает радиус немного меньше, чем реальный.
Т.е. мне нужно вычислить длину зеленой полоски. Сейчас она как видите не верна т.к. не на весь круг. Похоже это правильно зазывается хорда.

moka 16.11.2012 20:41

Ответ: Радиус среза круга
 
Чё?
Лично я вопроса не понял.
Картинка не наглядна, и не объясняет - не помогает понять вопрос.
Ты хочешь вычислить радиус между зелёной полоской и центром (красной точкой)?

Если да, то просто: abs(yA - yB).
Где yA - это y центра окружности, а yB это y зелёной полоски.

Учитывай, что то что ты знаешь - другие не знают. Читать чужие мысли мы пока не научились, следственно выражай мысль с достаточными данными для тех кто вообще не в теме, иначе тебе не помогут.

den 16.11.2012 20:55

Ответ: Радиус среза круга
 
ТС видимо имеет в виду хорду

radiobutton 16.11.2012 21:05

Ответ: Радиус среза круга
 
У круга радиус всегда одинаков. :)

dsd 16.11.2012 21:12

Ответ: Радиус среза круга
 
x*x+y*y-radius*radus = y
x*x = radius*radius - y*y + y

x1=sqrt( radius*radius - y*y + y) x2=-sqrt( radius*radius - y*y + y)

length = x1-x2
А так почему нельзя сделать?

WISHMASTER35 16.11.2012 22:57

Ответ: Радиус среза круга
 
radiobutton, ну я писал про срез круга.
Обновил первый пост. Впрочем как сказал Den это хорда.
dsd, да, все правильно. Спасибо!

private float GetRadius(float y) {
return (float) Math.sqrt( radius*radius - y*y + y);
}

WISHMASTER35 16.11.2012 23:15

Ответ: Радиус среза круга
 
dsd, что-то у меня твои равенства не сходятся.
Код:

int x = 5, y = 10;
int r = 20;
int tmp = x*x+y*y-r*r; // = -275

А должно было быть равным y т.е. 10?

radiobutton 16.11.2012 23:25

Ответ: Радиус среза круга
 
Если y это длина перпендикуляра проведенного к секущей (той твоей линии зеленой) из центра окружности, то длина секущей будит равна

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

где r радиус.

WISHMASTER35 16.11.2012 23:40

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

Сообщение от radiobutton (Сообщение 243817)
Если y это длина перпендикуляра проведенного к секущей (той твоей линии зеленой) из центра окружности, то длина секущей будит равна

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

где r радиус.

Странно, но и эта формула работает.
И эта sqrt( radius*radius - y*y + y) работает. Хотя они разные.

impersonalis 16.11.2012 23:46

Ответ: Радиус среза круга
 
если от центра вниз до хорды расстояние Y
то длина хорды = 2*L
где L = катет, в прямоугольном треугольнике с другим катетом, равным Y и гипотенузой R (радиус круга). Отсюда R^2=L^2+Y^2 (т. Пифагора)
или L=sqrt(R^2-Y^2)
длина хорды = 2*sqrt(R^2-Y^2)

(блин, всегда я к шапочному разбору попадаю - хоть прокомменчу решение)

в крайних точках решение очевидно верное:
1) в самом низу (и верху) Y=-R (или Y=R) => ans=2*sqrt(R^2-R^2)=0
2) в центре Y=0 => ans=2*sqrt(R^2-0)=2*R=D (диаметр)

В обшем - напортачить можно только с вычислением Y, который должен быть равен длине перпендикуляра от центра круга до хорды. Причём модуль брать не обязательно, т.к. величина входит в выражение во второй степени.

dsd 16.11.2012 23:55

Ответ: Радиус среза круга
 
А вот нет, я в виду имел уравнение окружности и прямой, и дальше искал пересечение.

radiobutton 16.11.2012 23:58

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

Сообщение от WISHMASTER35 (Сообщение 243823)
Странно, но и эта формула работает.
И эта sqrt( radius*radius - y*y + y) работает. Хотя они разные.

sqrt( radius*radius - y*y + y)
эта формула может работать в частном случае, когда y = 3 * (r*r -y*y)
или

3*y*y + y - 3*r*r = 0

D = 1 - 4 * 3 * (-3 * r * r) = 1 + 48 r*r

y = (-1 +- sqrt(1+48*r*r)) / 6

При такой ситуации та формула будит работать.:)

impersonalis 17.11.2012 00:03

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

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

Цитата:

x1=sqrt( radius*radius - y*y + y) x2=-sqrt( radius*radius - y*y + y)

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

WISHMASTER35 17.11.2012 00:21

Ответ: Радиус среза круга
 
Я теперь запутался.

MiXaeL 17.11.2012 00:30

Ответ: Радиус среза круга
 
Или я тупой или это:
2*(R^2 - y^2) ?
Типа прямоугольный треугольник, гипотенуза - радиус имеющегося круга, у - катет. Получаем второй катет и домножаем на два - вот и длина зеленой полоски.

АПД: не прочитал коммента radiobutton'a. Но товарищ переключатель дело говорит.
И импер дело говорит, мне крысы наиграли.

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, время: 16:38.

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