Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Формула попадания точки в эллипс, вписанный в прямоугольник.   Найти похожие ветки 

 
Курдль ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
1-1090395219
миня
2004-07-21 11:33
2004.08.01
как узнать длину строки?


4-1087926552
AlexZ_CRC
2004-06-22 21:49
2004.08.01
pChar и "+"


9-1082354536
Sphinx
2004-04-19 10:02
2004.08.01
Заголовки к DX9b


9-1082459065
KEBZ
2004-04-20 15:04
2004.08.01
DirectX


3-1089285508
Punker
2004-07-08 15:18
2004.08.01
Запрос для удаления дублирующихся записей