41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
1

Отрисовывание N угольника с закругленными углами

11.11.2018, 22:38. Показов 2531. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, озадачили меня задачкой написать алгоритм рисования N угольника с закругленными углами. В интернете есть код закругления углов по 3 точкам, но вот не понятно как его прикрутить к изменяемым параметрам (например при измененяемом кол-ве углов)

Вот сам код:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
private void DrawRoundedCorner(Graphics graphics, PointF angularPoint, 
                                PointF p1, PointF p2, float radius)
{
    //Vector 1
    double dx1 = angularPoint.X - p1.X;
    double dy1 = angularPoint.Y - p1.Y;
 
    //Vector 2
    double dx2 = angularPoint.X - p2.X;
    double dy2 = angularPoint.Y - p2.Y;
 
    //Angle between vector 1 and vector 2 divided by 2
    double angle = (Math.Atan2(dy1, dx1) - Math.Atan2(dy2, dx2)) / 2;
 
    // The length of segment between angular point and the
    // points of intersection with the circle of a given radius
    double tan = Math.Abs(Math.Tan(angle));
    double segment = radius / tan;
 
    //Check the segment
    double length1 = GetLength(dx1, dy1);
    double length2 = GetLength(dx2, dy2);
 
    double length = Math.Min(length1, length2);
 
    if (segment > length)
    {
        segment = length;
        radius = (float)(length * tan);
    }
 
    // Points of intersection are calculated by the proportion between 
    // the coordinates of the vector, length of vector and the length of the segment.
    var p1Cross = GetProportionPoint(angularPoint, segment, length1, dx1, dy1);
    var p2Cross = GetProportionPoint(angularPoint, segment, length2, dx2, dy2);
 
    // Calculation of the coordinates of the circle 
    // center by the addition of angular vectors.
    double dx = angularPoint.X * 2 - p1Cross.X - p2Cross.X;
    double dy = angularPoint.Y * 2 - p1Cross.Y - p2Cross.Y;
 
    double L = GetLength(dx, dy);
    double d = GetLength(segment, radius);
 
    var circlePoint = GetProportionPoint(angularPoint, d, L, dx, dy);
 
    //StartAngle and EndAngle of arc
    var startAngle = Math.Atan2(p1Cross.Y - circlePoint.Y, p1Cross.X - circlePoint.X);
    var endAngle = Math.Atan2(p2Cross.Y - circlePoint.Y, p2Cross.X - circlePoint.X);
 
    //Sweep angle
    var sweepAngle = endAngle - startAngle;
 
    //Some additional checks
    if (sweepAngle < 0)
    {
        startAngle = endAngle;
        sweepAngle = -sweepAngle;
    }
 
    if (sweepAngle > Math.PI)
        sweepAngle = Math.PI - sweepAngle;
 
    //Draw result using graphics
    var pen = new Pen(Color.Black);
 
    graphics.Clear(Color.White);
    graphics.SmoothingMode = SmoothingMode.AntiAlias;
 
    graphics.DrawLine(pen, p1, p1Cross);
    graphics.DrawLine(pen, p2, p2Cross);
 
    var left = circlePoint.X - radius;
    var top = circlePoint.Y - radius;
    var diameter = 2 * radius;
    var degreeFactor = 180 / Math.PI;
 
    graphics.DrawArc(pen, left, top, diameter, diameter, 
                     (float)(startAngle * degreeFactor), 
                     (float)(sweepAngle * degreeFactor));
}
 
private double GetLength(double dx, double dy)
{
    return Math.Sqrt(dx * dx + dy * dy);
}
 
private PointF GetProportionPoint(PointF point, double segment, 
                                  double length, double dx, double dy)
{
    double factor = segment / length;
 
    return new PointF((float)(point.X - dx * factor), 
                      (float)(point.Y - dy * factor));
}
Может у кого нибудь есть мысли? Буду очень благодарен за помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2018, 22:38
Ответы с готовыми решениями:

Определите площади правильных n-угольников (10-угольника; 50- угольника; 100-угольника)
Определите площади правильных n - угольников (10-угольника; 50-угольника; 100-угольника), вписанных...

Фрейм с закругленными углами
Здравствуйте,с HTML знаком не так давно, и при создании своего сайта возникает много вопросов. А...

Edit с закругленными углами
Приветствую. Работаю c Delphi 7. Там есть компонент Edit. Так вот. Он не совсем красив для меня....

Прямоугольник с закругленными углами
Нужно нарисовать в паскале знак. подскажите, как нарисовать прямоугольник с закругленными углами?)...

4
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
11.11.2018, 23:44 2
Лучший ответ Сообщение было отмечено MakcPletnev как решение

Решение

Цитата Сообщение от MakcPletnev Посмотреть сообщение
алгоритм рисования N угольника с закругленными углами
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
    static class Helper
    {
        public static GraphicsPath GetRoundedPolygon(float radius, int n, float roundCoeff = 0.9f)
        {
            var path = new GraphicsPath();
            for (int i = 0; i < n; i++)
            {
                var p0 = GetPoint(n, i - 1, radius);
                var p1 = GetPoint(n, i - 0, radius);
                var p2 = GetPoint(n, i + 1, radius);
 
                var p00 = Lerp(p0, p1, roundCoeff);
                var p22 = Lerp(p2, p1, roundCoeff);
                path.AddBezier(p00, p1, p1, p22);
            }
 
            path.CloseFigure();
 
            return path;
        }
 
        static PointF Lerp(PointF p1, PointF p2, float k)
        {
            return new PointF(p1.X * (1 - k) + p2.X * k, p1.Y * (1 - k) + p2.Y * k);
        }
 
        static PointF GetPoint(int n, int i, float radius)
        {
            var angle = i * 2 * Math.PI / n;
            return new PointF((float)Math.Cos(angle) * radius, (float)Math.Sin(angle) * radius);
        }
    }
Отрисовывание N угольника с закругленными углами
Вложения
Тип файла: zip WindowsFormsApplication398.zip (56.2 Кб, 5 просмотров)
6
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
12.11.2018, 00:24  [ТС] 3
Storm23, как всегда выручаешь) Обязательно завтра посмотрю

Добавлено через 10 минут
Storm23, а нет у этого алгоритма никакого названия? Хоть прочитать что код вообще делает и почему так получается)
0
Эксперт .NETАвтор FAQ
10409 / 5139 / 1824
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.11.2018, 00:35 4
Лучший ответ Сообщение было отмечено MakcPletnev как решение

Решение

Цитата Сообщение от MakcPletnev Посмотреть сообщение
а нет у этого алгоритма никакого названия?
Bezier and Mind Mixing Algorithm.
2
41 / 37 / 9
Регистрация: 01.02.2014
Сообщений: 825
12.11.2018, 10:13  [ТС] 5
Storm23, спасибо)
0
12.11.2018, 10:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2018, 10:13
Помогаю со студенческими работами здесь

Прямоугольник с закругленными углами Corel
Здравствуйте. Можно ли как-то нарисовать прямоугольник с закругленными углами через макрос? ...

Закрашенный прямоугольник с закруглёнными углами
Как нарисовать закрашенный прямоугольник с закруглёнными углами с помощью System.Drawing.Drawing2D?...

Страуструп. Окно с закруглёнными углами
Доброго времени суток! Вопрос может показаться элементарным, но всё же, бьюсь над заданием из книги...

Рисование прямоугольника с закругленными углами
Собственно, вопрос в теме. Никак не могу найти соответствующую функцию Прошу помощи


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru