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

Вниз

Проблемы с поворотом эллипса   Найти похожие ветки 

 
Renul   (2003-05-14 20:57) [0]

Уважаемые мастера! Прошу помощи. Я рисую эллипс таким образом:
with Image1 do begin
Canvas.Brush.Color := clblack;
Canvas.Brush.Style := bsSolid;
canvas.Ellipse(100,100,150,150); end;
Затем мне надо его перевернуть на заданный градус. Я пользуюсь формулой поворота:

procedure TForm1.SpeedButton3Click(Sender: TObject);
Var t:real; x1,x2,y1,y2 :integer;
begin
with Image1 do begin
Canvas.Brush.Color := clblack;
Canvas.Brush.Style := bsSolid;
t:=((strtoint(edit1.Text)*pi)/180); {задаю градус}
x1:= round (100*cos(t)+100*sin(t));
y1:= round (100*cos(t)-100-sin(t));
x2:= round (150*cos(t)+150*sin(t));
y2:= round (150*cos(t)-150*sin(t));
( x1,y1,x2,y2) Уважаемые мастера! Прошу помощи. Я рисую эллипс таким образом:
with Image1 do begin
Canvas.Brush.Color := clblack;
Canvas.Brush.Style := bsSolid;
canvas.Ellipse(100,100,150,150); end;
Затем мне надо его перевернуть на заданный градус. Я пользуюсь формулой поворота:

procedure TForm1.SpeedButton3Click(Sender: TObject);
Var t:real; x1,x2,y1,y2 :integer;
begin
with Image1 do begin
Canvas.Brush.Color := clblack;
Canvas.Brush.Style := bsSolid;
t:=((strtoint(edit1.Text)*pi)/180); {задаю градус}
x1:= round (100*cos(t)+100*sin(t));
y1:= round (100*cos(t)-100-sin(t));
x2:= round (150*cos(t)+150*sin(t));
y2:= round (150*cos(t)-150*sin(t));
image1.canvas.Ellipse(x1,y1,x2,y2);
end;
В результате эллипс искажается.
Но если пользоваться формулой x=a*cost y=b*sint, и выводит
Image.canvas.pixels[xn,yn]:=clred {xn,yn коэфициенты после поворота}
это очень не удобно и у меня выводится только одна точка. Пожалуйста, помогите:(Заранее спасибо.


 
Fenik   (2003-05-14 22:44) [1]

Открываем книжку по аналитической геометрии и смотрим формулу эллипса: (x-x0)^2/a^2 + (y-y0)^2/b^2 = 1

Моя старенькая реализация:

==================================
{Cx, Cy - координаты центра
a - половина длины эллипса
b - половина ширины
Angle - угол поворота
Detal - детализация (попробуй её всяко поменять)}

procedure DrawEllipse(Cnv: TCanvas; Cx, Cy, a, b, Angle, Detal: Integer);
var i: Integer;
shag, rebro{скелета}, x: Double;
ACos, ASin: Extended;
P1, P2: TPoint;

function RotP(y: Double): TPoint;
begin
Result.x := Cx + Round((x-Cx)*ACos - (y-Cy)*ASin);
Result.y := Cy + Round((x-Cx)*ASin + (y-Cy)*ACos);
end;

begin
shag := 2*a/Detal;
x := Cx - a;
Math.SinCos(Angle * (Pi / 180), ASin, ACos);

P1 := Point(Cx + Round((x-Cx)*ACos), Cy + Round((x-Cx)*ASin));
P2 := P1;
for i := 0 to Detal do begin
rebro := b*Sqrt(Abs(1 - Sqr((x-Cx)/a)));

Cnv.MoveTo(P1.x, P1.y);
P1 := RotP(Cy - rebro);
Cnv.LineTo(P1.x, P1.y);

Cnv.MoveTo(P2.x, P2.y);
P2 := RotP(Cy + rebro);
Cnv.LineTo(P2.x, P2.y);
( Sender: TObject) Открываем книжку по аналитической геометрии и смотрим формулу эллипса: (x-x0)^2/a^2 + (y-y0)^2/b^2 = 1

Моя старенькая реализация:

==================================
{Cx, Cy - координаты центра
a - половина длины эллипса
b - половина ширины
Angle - угол поворота
Detal - детализация (попробуй её всяко поменять)}

procedure DrawEllipse(Cnv: TCanvas; Cx, Cy, a, b, Angle, Detal: Integer);
var i: Integer;
shag, rebro{скелета}, x: Double;
ACos, ASin: Extended;
P1, P2: TPoint;

function RotP(y: Double): TPoint;
begin
Result.x := Cx + Round((x-Cx)*ACos - (y-Cy)*ASin);
Result.y := Cy + Round((x-Cx)*ASin + (y-Cy)*ACos);
end;

begin
shag := 2*a/Detal;
x := Cx - a;
Math.SinCos(Angle * (Pi / 180), ASin, ACos);

P1 := Point(Cx + Round((x-Cx)*ACos), Cy + Round((x-Cx)*ASin));
P2 := P1;
for i := 0 to Detal do begin
rebro := b*Sqrt(Abs(1 - Sqr((x-Cx)/a)));

Cnv.MoveTo(P1.x, P1.y);
P1 := RotP(Cy - rebro);
Cnv.LineTo(P1.x, P1.y);

Cnv.MoveTo(P2.x, P2.y);
P2 := RotP(Cy + rebro);
Cnv.LineTo(P2.x, P2.y);
x := x + shag;
end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Pen.Color := clRed;
DrawEllipse(Canvas, Width div 2, Height div 2, 120, 50, 70, 100);
end;
==================================


Где-то недоделка: корявый чуток на концах получается.



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

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

Наверх




Память: 0.46 MB
Время: 0.008 c
1-33572
Hollywood
2003-08-28 18:24
2003.09.11
Как узнать имя формы в которой лежит контрол


14-33778
Zhenka
2003-08-25 12:13
2003.09.11
GetLocaleInfo


11-33534
Alexander
2002-12-29 21:47
2003.09.11
Как реализовать такой код на KOL?


1-33642
Islander
2003-08-30 21:27
2003.09.11
Как грамотно уничтожить форму, чтобы освободилась память?


1-33577
MIKL
2003-08-28 16:04
2003.09.11
Cоздание простейшего графического редактора





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский