Главная страница
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.47 MB
Время: 0.015 c
14-33785
Ax
2003-08-22 01:36
2003.09.11
Почему пустая форма имеет большой объём?


14-33775
dimodim
2003-08-23 10:08
2003.09.11
Mysql i php


3-33467
KIR
2003-08-20 15:02
2003.09.11
Транзакции в парадоксе...


14-33809
МАКСИК
2003-08-22 08:20
2003.09.11
Вопрос именно по API


14-33736
Shopot
2003-08-23 20:39
2003.09.11
Картинки и иконки