Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы ;с поворотом эллипса


Renul ©   (2003-05-14 20:57:00) 

Уважаемые мастера!Прошу помощи. Я рисую эллипс таким образом:
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:00) [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;
==================================


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо