Главная страница
    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.007 c
1-33589
Pirat
2003-08-27 21:04
2003.09.11
TSplitter в стиле Mozilla, где взять ?


3-33465
Behemoth
2003-08-21 08:52
2003.09.11
Как вывести правильное значение среднего по целочисленному полю.


1-33551
-=@ndrew=-
2003-08-29 09:57
2003.09.11
подскажите плз.......


1-33536
dez
2003-09-01 19:03
2003.09.11
CoInitialize has not been called


6-33715
FireMan_Alexey
2003-06-26 16:30
2003.09.11
Помогите избавиться от ошибки (Socket error 10065)





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