Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Прорисовка эллипса под углом |
Автор: pashik2006 29.3.2006, 02:25 |
Добрый день. Вот столкнулся с проблемой прорисовки эллипса под углом. Если нужно просто вывести эллипс, я вывожу по формуле x^2/a^2+y^2/b^2=1, где a и b - половины большой и малой оси соответственно. Я циклом проганяю по иксу от -a до a и получаю значения игрика. При необходимости вывести эллипс под улом, я проделываю примерно тоже, тока перед выводом перевожу координаты из виртуальной системы координат (которая повернута на заданый угол), в мою реальную систему координат (формулы преобразования координат). Вот тока картина печальная выходит. Изза токо, что координаты округляются, Эллипс выходит очень корявый. На algolist.manual.ru есть хороший пример прорисовки окружности. Может кто знает как эллипс прорисовать. Заранее благодарен. x := Round((-a)*cos(fi*pi/180)-0*sin(fi*pi/180)); y := Round((-a)*sin(fi*pi/180)+0*cos(fi*pi/180)); Form1.Canvas.MoveTo(x+x0,y+y0); for x_ := -a to a do begin y_ := Round(sqrt(abs(b*b-b*b*x_*x_/(a*a)))); x := Round(x_*cos(fi*pi/180)-y_*sin(fi*pi/180)); y := Round(x_*sin(fi*pi/180)+y_*cos(fi*pi/180)); Form1.Canvas.LineTo(x+x0,y+y0); end; |
Автор: MBo 29.3.2006, 06:49 |
В Windows GDI эллипсы и окружности рисуются с помощью 4-х кривых Безье. Таким образом, нужно вычислить 12 контрольных точек для рисования окружности (для первого квадранта точки (R,0), (R,0.55228475*R),(0.55228475*R,R)(R,0)), провести над ними аффинное преобразование, и отрисовать PolyBezier |
Автор: pashik2006 30.3.2006, 00:51 |
А по какому принципу выщитываются эти коефициенты (0.55228475)?? И как их для овала учесть? |
Автор: cardinal 30.3.2006, 01:01 |
А можно работать в трехмерном пространстве и повернуть круг! сначала по оси y, а потом по оси z. Вот тебе и повернутый эллипс. ![]() (Отображать его конечно надо в 2D)... Сам придумал! ![]() |
Автор: MBo 30.3.2006, 06:38 |
> по какому принципу выщитываются эти коефициенты (0.55228475)?? Это приближение четверти окружности кривой Безье. Принцип такой - в первом квадранте дуга окружности начинается в точке (R,0), а вектор касательной направлен вертикально. Составляют такое уравнение, чтобы середина кривой Безье совпадала с серединой дуги, и находят множитель для определения контрольных точек. >И как их для овала учесть? Чтобы получить из окружности эллипс, проводят преобразования - масштабирования по осям, поворота, и переноса. Эти же преобразования применяются и к контрольным точкам Безье. |