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

Вниз

Как нарисовать дугу эллипса???   Найти похожие ветки 

 
Ivanov I   (2002-04-19 15:29) [0]

Извиняюсь за простой вопрос но
Есть такая задача:
надо нарисовать дугу эллипса по 3 точкам.(начало конец центр),
не используя canvas.arc , т.е. по точкам
Помогите!!


 
MBo ©   (2002-04-19 16:38) [1]

задача недоопределена - существует не один эллипс, который можно провести через эти точки


 
Donal_Graeme   (2002-04-19 17:17) [2]

ищи алгоритм Брезенхема, либо же по формуле эллипса.


 
MBo ©   (2002-04-19 17:26) [3]

>Donal_Graeme
трех точек, две из которых на одной высоте (предполагаю, именно это имелось в виду), недостаточно для определения эллипса. Автор не уточнил расположения.


 
ION T ©   (2002-04-19 21:27) [4]

Может имелась в виду середина дуги а не диаметра........


 
MBo ©   (2002-04-19 21:31) [5]

>ION T
неважно. если задан прямоугольник, в двух смежных углах которого начало и конец дуги, а ее середина касается противоположной стороны, то этого мало.


 
ION T ©   (2002-04-19 21:54) [6]

Кжется можно просто спроэктировать "среднюю" точку (В) на прямую АС..........


 
ION T ©   (2002-04-19 21:55) [7]

Извиняюсь. Это я не о том алгоритме подумал..........


 
annton   (2002-04-20 00:21) [8]

Для этого нужно найти координаты точек(а через эти точки можно провести 4 дуги) центрров двух окружностей проходящих через эти точки.
Для этого, вспоминая математику и геометрию, нужно решить систему квадратных уравнений в общем виде - это уравнения окружностей с центрами в твоих точках и одинаковым радиусом. Точка пересечения этих окружностей и будет центром НУЖНОЙ окружности, зная которую можно провести Arc(...).
(a1-x1)^2+(b1-y1)^2=R^2
(a2-x2)^2+(b2-y2)^2=R^2

Если влом решать, пиши на annton@rambler.ru пришлю алгоритм!


 
MBo ©   (2002-04-20 00:38) [9]

>annton
окружность - ОДНА
дуг ЭЛЛИПСОВ - много


 
Ivanov I   (2002-04-20 09:31) [10]

Большое спасибо, я уже понял


 
Donal_Graeme   (2002-04-20 18:03) [11]

2 Mbo:
немного с запозданием, но - именно по той формулировке вопроса - по трём точкам - ты прав, неопределённость.
Именно поэтому я подумал, что автор просто хотел нарисовать дугу эллипса, не пользуясь стандартными средствами, зная центр, оба радиуса и углы начала и конца.


 
Andrey007   (2002-04-22 13:41) [12]

type
Point=class
fi,l: Extended;
end;
Vector=record
x,y,z: Extended
end;

function Sign(a: Real): ShortInt;
begin
if a>0 then result:=1 else if a<0 then result:=-1 else result:=0
end;

function CalculateEllips(Centre: Point; R1,R2,Azimut,BeginAngle,EndAngle: Real;
Clock: Boolean): TList; // Clock - признак рисования от меньшего угла к большему или наоборот
const rz=6372.9; // радиус сферы Каврайского в км
var fi,la,delta,a,be,en: Extended;
ek,e3,e0,em,egr: Vector;
p: Point;
i: Cardinal;
Li: TList;
begin
Result:=nil;
if (R1<=0) or (R2<=0) then Exit;
Li:=TList.Create;
Li.Add(Centre);
fi:=Centre.fi*pi/180; // перевод градусов в радианы
la:=Centre.l*pi/180;
e0.x:=cos(la)*cos(fi); em.x:=-sin(la);
e0.y:=sin(la)*cos(fi); em.y:=cos(la);
e0.z:=sin(fi); em.z:=0;
e3:=VectPr(e0,em);
i:=0;
if BeginAngle>EndAngle then //1
begin
if Clock then // От меньшего к большему
begin
be:=EndAngle*pi/180;
en:=BeginAngle*pi/180
end
else
begin
be:=BeginAngle*pi/180;
en:=EndAngle*pi/180+2*pi
end
end
else if Clock then // От большего к меньшему
begin
be:=BeginAngle*pi/180;
en:=EndAngle*pi/180
end
else
begin
be:=EndAngle*pi/180;
en:=BeginAngle*pi/180+2*pi
end;
repeat
p:=Point.Create;
a:=Be+(i-Azimut)*pi/180;
delta:=R1*R2*sqrt((1+sqr(Tan(a)))/(R2*R2+sqr(R1*Tan(a))))/rz;
a:=a+Azimut*pi/180;
ek.x:=e3.x*cos(a)+em.x*sin(a); egr.x:=e0.x*cos(delta)+ek.x*sin(delta);
ek.y:=e3.y*cos(a)+em.y*sin(a); egr.y:=e0.y*cos(delta)+ek.y*sin(delta);
ek.z:=e3.z*cos(a)+em.z*sin(a); egr.z:=e0.z*cos(delta)+ek.z*sin(delta);
p.fi:=ArcSin(egr.z);
if egr.x>0 then p.l:=ArcSin(egr.y/cos(p.fi))
else if egr.x<0 then p.l:=pi-Abs(ArcSin(egr.y/cos(p.fi)))*Sign(egr.y)
else if egr.y<0 then p.l:=-pi/2
else p.l:=pi/2;
p.l:=p.l*180/pi;
p.fi:=p.fi*180/pi;
Li.Add(p); inc(i)
until a>En;
result:=Li
end;

Эта функция возвращает список с координатами точек дуги эллипса на шаре, аппрокисмирующем Землю (сфера Каврайского). Если убрать проецирование на шар, то получится то, что Ivanov I просил. Правда для использования этой процедуры ему надо будет определить градусную меру начального и конечного углов и угол наклона эллипса в градусах (Azimut). Предполагается, что координаты центра заданы как широта и долгота, причём дробная часть не в минутах, а в десятичных долях. Соответственно, и на выходе данные в таком же формате. Дуга эллипса считается с шагом 1 градус.


 
Andrey007   (2002-04-22 13:46) [13]

Небольшое уточнение - эта функция возвращает не дугу только, а дугу вместе с центром. Чтобы она возвращала только дугу, надо убрать строчку Li.Add(Centre);



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-95851
skyslider
2002-08-17 22:38
2002.08.29
Как удалить выделенную строку в StringGrid


6-95932
Егоров Николай
2002-06-15 19:37
2002.08.29
Как правильно получить(отправить) TMemoryStream используя TNMUDP?


3-95682
nikolo
2002-08-08 14:11
2002.08.29
Вызов функции из DLL с передачей массива как параметра


1-95827
Ferrari_the_best
2002-08-17 05:50
2002.08.29
!!!Help!!!


14-95979
pusrg
2002-08-02 14:48
2002.08.29
Использование фреймов