|
#1
|
||||
|
||||
Эллипс
Вот нашел формулу
Цитата:
Код:
function Ellipse(X, A, B: Integer): Integer; var RealA, RealB: Integer; begin if A < B then begin RealA:=B; RealB:=A; end else begin RealA:=A; RealB:=B; end; Result:=Round(Sqrt(RealB*RealB - (X*X*RealB*RealB)/(RealA*RealA))); end; Код:
var i: Integer; begin for i:=Image1.Width div 2 to Image1.Width do Image1.Canvas.Pixels[i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack; end; Что не так? Может я неправильно преобразовал первое выражение? Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#2
|
||||
|
||||
Просто в один прекрасный момент выражение под корнем становиться меньше 0.
Хорошо написанная программа не требует документации ICQ 9-184-668. |
#3
|
||||
|
||||
Спасибо. Ошибка была там.
Но теперь Заменил Код:
Result:=Round(Sqrt(Abs(RealB*RealB - (X*X*RealB*RealB)/(RealA*RealA)))); ... for i:=0 to Image1.Width do Image1.Canvas.Pixels[i, Ellipse(i, Image1.Width, Image1.Height)]:=clBlack; Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#4
|
|||
|
|||
Цитата:
Тут нельзя использовать никаких abs. А то получается что если a*a < x*x они как бы меняются местами. Главное условие x должен быть меньше a по модулю. Рисовать надо по циклу, где x принимает значения допустим от -100 до 100. И использовать два уравнения. Первое положительная полудуга. Второе отрицательная полудуга. y=b/a*sqrt(a*a-x*x); y=-b/a*sqrt(a*a-x*x); И получаем замечательный эллипс. |
#5
|
||||
|
||||
Большое спасибо! Вот так сделал и все OK
Код:
function Ellipse(X, A, B: Integer): Integer; begin if A*A < X*X then Result:=Round(b/a*sqrt(-(a*a-x*x))) else Result:=Round(b/a*sqrt(a*a-x*x)); end; var i: Integer; begin for i:={Image1.Width}0 div 2 to Image1.Width div 2 do begin Image1.Canvas.Pixels[Image1.Width div 2 + i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack; Image1.Canvas.Pixels[Image1.Width div 2 - i, Image1.Height div 2 + Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack; Image1.Canvas.Pixels[Image1.Width div 2 + i, Image1.Height div 2 - Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack; Image1.Canvas.Pixels[Image1.Width div 2 - i, Image1.Height div 2 - Ellipse(i, Image1.Width div 2, Image1.Height div 2)]:=clBlack; end; Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#6
|
|||
|
|||
Да классный эллипс. Осталось только сделать, чтобы параметры вводились с клавиатуры.
|
#7
|
||||
|
||||
Мне с клавиатуры не надо =)
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |