Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/20: Рейтинг темы: голосов - 20, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 18.05.2011
Сообщений: 39
1

Нужен метод, который умеет строить эллипс, вписанный в прямоугольник

13.02.2012, 01:55. Показов 4137. Ответов 7
Метки нет (Все метки)

Доброго времени суток. Нужен метод, который умеет строить эллипс, вписанный в прямоугольник, который не обязательно параллелен осям координат. Вариант поворота эллипса через класс graphicspath не подходит.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 01:55
Ответы с готовыми решениями:

Есть вписанный в прямоугольник эллипс (в 2D), как найти точки его фокуса?
Привет! Ну собственно сабж. Есть прямоугольник, есть координаты всех его вершин, как найти...

Помог бы вам чем-то дизассемблер, который умеет строить блок схемы?
Ещё один вопрос того же сорта: А дизассемблеры, они код разгадывают линейно или проходят по всем...

Нарисовать эллипс, вписанный в ромб
нарисовать эллипс вписанный в ромб; a,b-полуоси внутреннего эллипса; n-количество описанных около...

Кто умеет строить диаграммы?
Помогите пожалуйста построить диаграмму Насси — Шнейдермана к данному коду: procedure...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
7
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
13.02.2012, 02:14 2
Цитата Сообщение от BHYCHIK Посмотреть сообщение
через класс graphicspath не подходит
Почему? Сам алгоритм нужен?
Тогда алгоритм Брезенхама или тоже самое, но через синус и косинус. А наклон делать с помощью поворота системы координат. Смысл в том, чтобы получить список точек провести через них ломанную и отобразить на экране. Был еще алгоритм, который применяется в компьютерной графике для быстрого рендеринга для каждой простой фигуры, но я не помню название.

Если поискать в гугле, то можно найти формулу построения эллипса по центру, полуосям и углу наклона, но она очень страшная.
Нужен метод, который умеет строить эллипс, вписанный в прямоугольник
1
1 / 1 / 0
Регистрация: 18.05.2011
Сообщений: 39
13.02.2012, 09:05  [ТС] 3
Спасибо, такой вариант уже подойдет. У меня задача реализовать всю математику для поворотов, масштабирований и сдвигов самому, без встроенных функций, поэтому в идеале найти библиотечную функцию, которая как параметр принимает 4 вершины прямоугольника.

Эти 4 вершины я бы мог поворачивать без проблем и перестраивать прямоугольник, а в него вписывать эллипс.
0
1462 / 1170 / 551
Регистрация: 08.01.2012
Сообщений: 4,513
13.02.2012, 09:28 4
вроде этого?
0
Миниатюры
Нужен метод, который умеет строить эллипс, вписанный в прямоугольник  
1 / 1 / 0
Регистрация: 18.05.2011
Сообщений: 39
13.02.2012, 09:29  [ТС] 5
Да, именно оно! Только, чтобы прямоугольник невидимый был.

Если нет, чтобы прямоугольник был невидимый, все равно пойдет. Закрашу его вручную.
0
1462 / 1170 / 551
Регистрация: 08.01.2012
Сообщений: 4,513
13.02.2012, 09:43 6
как и было сказано выше, голимая тригонометрия
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
namespace Ellipse
{   
    public partial class Ellipse : Form
    {   //растояния от центра до точек эллипса с шагом один градус
        double[] ArL = new double[361];
        double A = 200, B = 100, L;//полуоси
        double Ang, dAng = Math.PI / 180;
        
        void Draw()
        {
            for (int i = 0; i < ArL.Length; i++)
            {
                Ang = Math.Atan(Math.Tan(i * dAng) * A / B);
                double X = A * Math.Cos(Ang);
                double Y = B * Math.Sin(Ang);
                ArL[i] = Math.Sqrt(X * X + Y * Y);
            }
            PointF[] ArP = new PointF[361];
            int Slope = 30;
            float X0 = ClientSize.Width / 2;
            float Y0 = ClientSize.Height / 2;
            for (int i = 0; i < ArL.Length; i++)
            {
                Ang = (i - Slope) * dAng;
                ArP[i].X = (float)(X0 + ArL[i] * Math.Cos(Ang));
                ArP[i].Y = (float)(Y0 - ArL[i] * Math.Sin(Ang));
            }
 
            Graphics Gr = CreateGraphics();
            Gr.DrawLine(Pens.Red, new PointF(X0, 0), new PointF(X0, ClientSize.Height - 1));
            Gr.DrawLine(Pens.Red, new PointF(0, Y0), new PointF(ClientSize.Width - 1, Y0));
            Gr.DrawLines(Pens.Black, ArP);//эллипс
            Array.Resize<PointF>(ref ArP, 5);
            L = Math.Sqrt(A * A + B * B);
            Ang = Math.Atan(B / A);
            double Slp = Slope * dAng;
            ArP[0] = new PointF(X0 + (float)(L * Math.Cos( Ang - Slp)), Y0 - (float)(L * Math.Sin( Ang - Slp)));
            ArP[1] = new PointF(X0 + (float)(L * Math.Cos(-Ang - Slp)), Y0 - (float)(L * Math.Sin(-Ang - Slp)));
            ArP[2] = new PointF(X0 + (float)(L * Math.Cos(Math.PI + Ang - Slp)), (float)(Y0 - L * Math.Sin(Math.PI + Ang - Slp)));
            ArP[3] = new PointF(X0 + (float)(L * Math.Cos(Math.PI - Ang - Slp)), (float)(Y0 - L * Math.Sin(Math.PI - Ang - Slp)));
            ArP[4] = ArP[0];
            Gr.DrawLines(Pens.Black, ArP);//прямоугольник
        }
 
        public Ellipse()
        {
            InitializeComponent();
        }
 
        private void Ellipse_Shown(object sender, EventArgs e)
        {
            Draw();
        }
 
    }
}
1
Заблокирован
13.02.2012, 10:11 7
может все же воспользоваться встроенными функциями:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        Point coord = new Point(100, 100);//координаты
        float angle = 45f;//угол
        float width = 90, height = 60;//размеры
 
        private void Program_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.TranslateTransform(coord.X, coord.Y);
            e.Graphics.RotateTransform(angle);//угол
            e.Graphics.DrawEllipse(new Pen(Color.Red), -width / 2, -height / 2, width, height);
            e.Graphics.ResetTransform();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            angle += 10;
            Invalidate();
        }
0
1 / 1 / 0
Регистрация: 18.05.2011
Сообщений: 39
14.02.2012, 01:02  [ТС] 8
Огромное всем спасибо за помощь. Учу алгоритм Брезенхама. Конкретно эту проблему удалось решить разбиением эллипса на точки. Первоначально были проблемы из-за того, что было всего 13 точек. Но проблему решил методом Flatten.

C#
1
2
3
4
5
6
7
        private MyPoint[] GetPointsOfEllipse(int x, int y, int w, int h)
        {
            GraphicsPath tmpPointsCreator = new GraphicsPath();
            tmpPointsCreator.AddEllipse(x, y, w, h);
            tmpPointsCreator.Flatten();
            return ConvertPointFToMyPoint(tmpPointsCreator.PathPoints);
        }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2012, 01:02

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Кто умеет строить блок схемы?
Написал программу в с++ и не могу построить блок схему...нужно для курсовой... помогите кому не...

Пятиугольник вписанный в прямоугольник
Рисование вписанных в прямоугольную область равностороннего пятиугольника и звезды. Прямоугольник...

Треугольник вписанный в прямоугольник
Прямоугольный треугольник вписан в прямоугольник и имеет общую вершину с прямоугольником. Известны...

Прямоугольник, вписанный в прямоугольник
Всем привет! Пытаюсь сделать анимацию на js (2 горизонтальных прямоугольника поворачиваются,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.