Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2003.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
4-33854
boby
2003-07-08 17:27
2003.09.11
Как можно научить имя приложения через ей handle


3-33450
Ольга
2003-08-20 16:06
2003.09.11
InterBase & MSWord


1-33563
Eagle Owl
2003-08-28 22:34
2003.09.11
Инсталяция программы с помощью InstallShield


3-33516
eds
2003-08-19 17:28
2003.09.11
Как сделать зебру в гриде в Firebird?


3-33500
Ник
2003-08-20 10:47
2003.09.11
DBASE





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