Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизФормула попадания точки в эллипс, вписанный в прямоугольник. Найти похожие ветки
← →
Курдль © (2004-07-15 16:49) [0]Сабж. Желательно в экранных координатах. Спасибо, Я.
← →
clickmaker © (2004-07-15 16:55) [1]CreateEllipticRgn()
PtInRegion()
← →
Курдль © (2004-07-15 17:04) [2]Так просто? :) Я РЫДАЮ! А то я математики нагородил, что еле ворочается! Спасибо!
← →
Ega23 © (2004-07-15 17:27) [3]:о)
А если с математикой, то там тоже ничего сложного нет:
Эллипс кривая, являющаяся геометрическим местом точек плоскости, сумма расстояний которых от двух данных точек F1 и F2 (фокусов) этой плоскости есть величина постоянная, равная данному отрезку АВ, называемому большой осью. Эллипс лекальная кривая, имеющая две оси симметрии.
Если сумма растояний от твоей точки до фокусов эллипса > длины большой оси - точка эллипсу НЕ принадлежит.
← →
Курдль © (2004-07-15 17:29) [4]
> Если сумма растояний от твоей точки до фокусов эллипса >
> длины большой оси - точка эллипсу НЕ принадлежит.
Точно! А как вычислить фокусы?
← →
Ega23 © (2004-07-15 17:32) [5]Точно! А как вычислить фокусы?
Блин, не помню я всей этой геометрии уже. :-( Надо было лет 5 назад спрашивать.
Поищи в Яндексе
← →
Ega23 © (2004-07-15 17:34) [6]http://www.ducc.donetsk.ua/vm/02-6/02-6.htm
Вот что-то понапихано, извини - формул не вижу, т.к. графика отключена.
← →
Курдль © (2004-07-15 17:50) [7]
> Ega23 © (15.07.04 17:32) [5]
> Блин, не помню я всей этой геометрии уже. :-( Надо было
> лет 5 назад спрашивать.
А! Я думал ты знаешь, а ты такой же, как я! ;)
Ну и посмотрел я в яндексе, нашел и реализовал. Только зачем искать фокусы, если есть собснно формула эллипса:
x** y**
--- + --- = 1
a** b**
← →
Ega23 © (2004-07-15 17:55) [8]Это в каноническом виде. У тебя кривая второго порядка может задаваться разными способами. Если ты сумеешь провести преобразования, чтобы привести кривую к каноническому виду - считай 95% дела сделал.
Я просто не помню уже как это делается. В универе когда-то давно такие задачки как орехи щёлкал.
← →
Курдль © (2004-07-15 18:01) [9]
> Ega23 © (15.07.04 17:55) [8]
Да спасибо, оно у меня работало, но значительно медленнее, чем встроенная функция, которая нашлась стараниями уважаемого clickmaker © (15.07.04 16:55) [1]
Я, в принципе, тож когда-то роторы считал с дивергенциями и не шибко запинался :)
← →
nikkie © (2004-07-15 19:44) [10]>есть собснно формула эллипса:
ну и в чем проблема?
есть точка (x,y). считаем
x^2/a^2 + y^2/b^2
и сравниваем с 1.
< 1 - внутри
= 1 - на границе
> 1 - снаружи.
← →
Курдль (2004-07-15 23:33) [11]nikkie © (15.07.04 19:44) [10]
ну и в чем проблема?
Да ни в чем, собственно. Вот 2 процедуры первая - моя, вторая - clickmaker © (15.07.04 16:55) [1]
Как ни странно, но моя все равно работает быстрее. Можете попробовать :(
procedure TForm1.Ellipse(ACanvas: TCanvas; ARect: TRect);
var x, y: Integer;
a, b, a2, b2, x0, y0, r: Double;
begin
x0 := (ARect.Right + ARect.Left) / 2.0;
y0 := (ARect.Bottom + ARect.Top) / 2.0;
a := (ARect.Right - ARect.Left) / 2.0;
b := (ARect.Bottom - ARect.Top) / 2.0;
a2 := Sqr(a);
b2 := Sqr(b);
for y := ARect.Top to ARect.Bottom do
begin
for x := ARect.Left to ARect.Right do
begin
r := (Sqr(x - x0) / a2) + (Sqr(y - y0) / b2);
if r < 1 then ACanvas.Pixels[x, y] := clNavy;
end;
end;
end;
procedure TForm1.Ellipse2(ACanvas: TCanvas; ARect: TRect);
var x, y: Integer;
ergn: HRGN;
begin
ergn := CreateEllipticRgn(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom);
try
for y := ARect.Top to ARect.Bottom do
for x := ARect.Left to ARect.Right do
if PtInRegion(ergn, x, y) then ACanvas.Pixels[x, y] := clMaroon;
finally
DeleteObject(ergn);
end;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c