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

Алгоритм Сазерленда-Коэна

18.01.2019, 11:29. Просмотров 302. Ответов 0

Привет, форумчане.
У меня есть программа, которая делает отсечение окном. Но делает это с искажениями.
Не могли бы вы подсказать, что нужно исправить, чтобы отсечение было без искажений?
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace LR1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private const double Sin60 = 0.86602540378443864676372317075294;
 
        private static readonly Color ImageBackColor = Color.White;
 
        private readonly Pen mainPen = new Pen(Color.Cyan, 3);
 
        private readonly Pen backPen = new Pen(ImageBackColor, 3);
 
        private int[] bigWindow;
 
        private int[] littleWindow;
 
        private const int FirstSize = 80;
 
        private const int SecondSize = 80;
 
        private const int MidleSize = 80;
 
        private double[,] offsets = new double[6, 2];
 
        private  PointF[] currentPoints = new PointF[6];
 
        private Point currentPosition;
 
        private int stepNumber = 0;
 
        private const int StepsCount = 0;
 
        private Bitmap image;
 
        private Graphics graphics;
 
        private void goButton_Click(object sender, EventArgs e)
        {
            bigWindow = new int[] { pictureBox1.Width / 3, 2 * pictureBox1.Width / 3, pictureBox1.Height / 4, 3 * pictureBox1.Height / 4 };
            littleWindow = new int[] { pictureBox1.Width / 3, pictureBox1.Width / 2, pictureBox1.Height / 3, 2 * pictureBox1.Height / 3 };
            Draw();
        }
 
        private void Draw()
        {
            image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            graphics = Graphics.FromImage(image);
            graphics.Clear(ImageBackColor);
            DrawWindow();
            stepNumber = 0;
            DoAnimation(graphics);
            pictureBox1.Image = image;
        }
 
        private void DrawWindow()
        {
            DrawWindow(bigWindow, graphics);
            DrawWindow(littleWindow, graphics);
            graphics.DrawLine(backPen, littleWindow[0], littleWindow[2], littleWindow[0], littleWindow[3]);
        }
 
        private void DrawWindow(int[] window, Graphics gr)
        {
            gr.DrawLine(new Pen(Color.Black),window[0],window[2],window[0] ,window[3]);
            gr.DrawLine(new Pen(Color.Black), window[1], window[2], window[1], window[3]);
            gr.DrawLine(new Pen(Color.Black), window[0], window[2], window[1], window[2]);
            gr.DrawLine(new Pen(Color.Black), window[0], window[3], window[1], window[3]);
        }
 
        private void DoAnimation(Graphics graphics)
        {
            currentPosition = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);
            currentPoints = GetHexagon(currentPosition);
            WriteFigure(currentPoints, graphics, mainPen);
            timer1.Enabled = true;
        }
 
        private PointF[] GetHexagon(Point startPosition)
        {
            return new PointF[]
            {
                new PointF(startPosition.X - SecondSize/2, startPosition.Y - (int)(SecondSize*Sin60)),
                new PointF(startPosition.X + SecondSize/2, startPosition.Y - (int)(SecondSize*Sin60)),
                new PointF(startPosition.X + SecondSize, startPosition.Y),
                new PointF(startPosition.X + SecondSize/2, startPosition.Y + (int)(SecondSize*Sin60)),
                new PointF(startPosition.X - SecondSize/2, startPosition.Y + (int)(SecondSize*Sin60)),
                new PointF(startPosition.X - SecondSize, startPosition.Y),
            };
        }
 
        private void WriteFigure(PointF[] points, Graphics gr, Pen pen)
        {
            var lines = new List<Line>();
            for (int i = 0; i < points.Length; i++)
            {
                lines.Add(new Line
                {
                    Start =  points[i],
                    End = points[(i + 1)%points.Length]
                });
            }
            List<Line> drawLines = SizzerlandCouen.Work(lines, bigWindow, false);
            drawLines.AddRange(SizzerlandCouen.Work(lines, littleWindow, true));
 
            foreach (var line in drawLines)
            {
                gr.DrawLine(pen, line.Start, line.End);
            }
        }
 
        private PointF[] GetStartPoints(PointF[] fisrtFigurePoints)
        {
            return new PointF[] { fisrtFigurePoints[0], fisrtFigurePoints[1], fisrtFigurePoints[2], fisrtFigurePoints[3], fisrtFigurePoints[0], fisrtFigurePoints[1]};
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            stepNumber++;
            if (stepNumber == StepsCount)
            {
                timer1.Enabled = false;
            }
            else
            {
                WriteNewFigure();
                /*timer1.Enabled = false;
                MessageBox.Show("fr");
                timer1.Enabled = true;*/
            }
        }
 
        private void WriteNewFigure()
        {
            if (moveTypeRadioButton.Checked)
            {
                WriteFigure(currentPoints, graphics, backPen);
            }
 
            var rand = new Random();
 
            currentPosition.X += rand.Next(-45, 45);
            currentPosition.Y += rand.Next(-45, 45);
            currentPoints = this.GetHexagon(currentPosition);
            WriteFigure(currentPoints, graphics, mainPen);
            pictureBox1.Image = image;
        }
    }
}
0
Миниатюры
Алгоритм Сазерленда-Коэна  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2019, 11:29
Ответы с готовыми решениями:

Реализовать алгоритм Коэна-Сазерленда
Помогите реализовать алгоритм Коэна-Сазерленда на PascalABC

Алгоритм двумерного отсечения Сазерленда-Коэна
Здравствуйте, помогите реализовать алгоритм двумерного отсечения Сазерленда-Коэна, пожалуйста.

Алгоритм Коэна-Сазерленда - линии не перекрашиваются
Подскажите, в чем ошибка? Не хочет перекрашивать линии using System; using...

Алгоритм отсечения Коэна-Сазерленда с использованием MMX-инструкций
Реализовать с использованием MMX-инструкций алгоритм отсечения Коэна-Сазерленда, включающий...

Отсечение алгоритмом Коэна — Сазерленда
Классифицируем все точки в зависимости от их положения по отношению к отсекающим прямым 1, 2, 3, 4:...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2019, 11:29

Метод коэна сазерленда: сделать перетаскивание квадрата мышкой
Подскажите как реализовать что бы этот метод.Нашел такой код ,не могу сделать перетаскивание...

Написать программу, где используется алгоритм Сазерленда – Кохена для отсечения отрезка
Здрасти, не думал что когда нибудь обращусь с этим, но пришлось вот. Помогите написать...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab...


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

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

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