Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.035 c
3-1089403726
genek84
2004-07-10 00:08
2004.08.01
Как узнать путь к открытой БД


1-1090304726
npr2
2004-07-20 10:25
2004.08.01
определение ANSI-кода символа


14-1089373794
_DS
2004-07-09 15:49
2004.08.01
Библиотека


1-1090326375
ИМХО
2004-07-20 16:26
2004.08.01
Структурированное хранилище


14-1089377109
YurikGL
2004-07-09 16:45
2004.08.01
Выключить компьютер.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский