Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 25.04.2015
Сообщений: 12

Отрисовка фигуры в форме Windows по координатам из исходного файла

04.05.2015, 15:04. Показов 2396. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто может детально объяснить код и предложить варианты улучшения/оптимизации?
Задачи:
• Отрисовка фигуры в форме Windows по координатам из исходного файла
• Заливка внутренних и внешних фигур разными цветами
• Сохранение внутренних фигур в новый файл

Класс File
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    static class File
    {
        public static int LengthKoor;
        public static int LengthPoints;
        public static int[,] FiguresPoints = new int[LengthPoints, 4];
        public static Point[] Koordinats;
        public static Figure[] GetFigures(string wayKoor, string wayPoints)
        {
            LengthKoor = 0 ;
            LengthPoints=0;
            StreamReader FKoordinats = new StreamReader(@wayKoor);
            StreamReader FFigures = new StreamReader(@wayPoints);
            string line;
            while(FKoordinats.ReadLine() != null)
            {
                LengthKoor++;
            }
            while (FFigures.ReadLine() != null)
            {
                LengthPoints++;
            }
            FFigures.Close();
            FKoordinats.Close();
            FKoordinats = new StreamReader(@wayKoor);
            FFigures = new StreamReader(@wayPoints);
            Figure[] Figures = new Figure[LengthPoints];
            Koordinats= new Point[LengthKoor];
            Koordinats = new Point[LengthKoor];
            for (int i = 0; (line = FKoordinats.ReadLine()) != null; i++)
            {
                int x;
                int y;
                string word = null;
                int k = 0;
                for (int j = 0; line[j] != ' '; j++)
                {
                    word += line[j];
                    k++;
                }
                x = Convert.ToInt32(word);
                word = "";
                for (int j = k + 1; j < line.Length; j++)
                {
                    word += line[j];
                }
                y = Convert.ToInt32(word);
                Koordinats[i] = new Point(x, y);
            }
            double Xmax = Koordinats[0].X;
            double Xmin = Koordinats[0].X;
            double Ymax = Koordinats[0].Y;
            double Ymin = Koordinats[0].Y;
            for (int i = 0; i < Koordinats.Length; i++)
            {
                if (Koordinats[i].X > Xmax) { Xmax = Koordinats[i].X; }
                if (Koordinats[i].X < Xmin) { Xmin = Koordinats[i].X; }
                if (Koordinats[i].Y > Ymax) { Ymax = Koordinats[i].Y; }
                if (Koordinats[i].Y < Ymin) { Ymin = Koordinats[i].Y; }
            }
            for (int i = 0; i < Koordinats.Length; i++)
            {
                double X = ((Koordinats[i].X) / (Xmax - Xmin)) * 640+25;
                double Y = (1-((Koordinats[i].Y) / (Ymax - Ymin)))*640+25;
                Koordinats[i].X = (int)X;
                Koordinats[i].Y = (int)Y;
            }
            int[,] FiguresPointsBuf = new int[LengthPoints, 4];
            for (int i = 0; (line = FFigures.ReadLine()) != null; i++)
            {
                string word = "";
                int k = -1;
                for (int j = 0; j < 4; j++)
                {
                    for (int t = ++k; line[t] != ' '; t++)
                    {
                        word += line[t];
                        k++;
                        if (k >= line.Length) break;
                    }
                    FiguresPointsBuf[i, j] = Convert.ToInt32(word);
                    word = "";
                }
                FiguresPoints = FiguresPointsBuf;
                if (FiguresPoints[i, 3] == -1)
                {
                    Figures[i] = new Triangle(Koordinats[FiguresPoints[i, 0]], Koordinats[FiguresPoints[i, 1]],
                        Koordinats[FiguresPoints[i, 2]]);
                }
                else
                {
                    Figures[i] = new Rectangle(Koordinats[FiguresPoints[i, 0]], Koordinats[FiguresPoints[i, 1]],
                        Koordinats[FiguresPoints[i, 2]], Koordinats[FiguresPoints[i, 3]]);
                }
            }
            FFigures.Close();
            FKoordinats.Close();
            return Figures;
        }
        public static void Save()
        {
            Figure[] Figures = File.GetFigures(Form1.wayKoor, Form1.wayPoints);
            StreamWriter FFigures = new StreamWriter(@"newFigures.txt");
            Figures = File.SetIntern(Figures);
            for (int i = 0; i < LengthPoints; i++)
            {
                if (Figures[i].intern)
                {
                    FFigures.WriteLine(FiguresPoints[i,0].ToString()+" "+FiguresPoints[i,1].ToString()+" "+FiguresPoints[i,2].ToString()+" "+FiguresPoints[i,3].ToString());
                }
            }
            FFigures.Close();
        }
        public static Figure[] SetIntern(Figure[] Figures)
        {
            for (int i = 0; i < FiguresPoints.GetLength(0); i++)
            {
                bool[] intern;
                int[] Figura1;
                if (FiguresPoints[i,3]==-1)
                {
                    Figura1 = new int[3] { FiguresPoints[i, 0], FiguresPoints[i, 1], FiguresPoints[i, 2] };
                    intern=new bool[3]{false,false,false};
                }
                else 
                {
                    Figura1 = new int[4] { FiguresPoints[i, 0], FiguresPoints[i, 1], FiguresPoints[i, 2], FiguresPoints[i,3] };
                    intern=new bool[4]{false,false,false,false};
                }
                for (int j = 0; j < Figura1.Length; j++)
                {
                    for (int k = 0; k < FiguresPoints.GetLength(0); k++)
                    {
                        int[] Figura2; 
                        if (FiguresPoints[k,3]==-1)
                        {
                            Figura2 = new int[3] { FiguresPoints[k, 0], FiguresPoints[k, 1], FiguresPoints[k, 2] };
                        }
                        else
                        {
                            Figura2 = new int[4] { FiguresPoints[k, 0], FiguresPoints[k, 1], FiguresPoints[k, 2], FiguresPoints[k,3] };
                        }
                        if (i != k)
                        {
                            for (int s = 0; s < Figura2.Length; s++)
                            {
                                {
                                    if ((Figura1[j] == Figura2[s] && Figura1[(j + 1) % Figura1.Length] == Figura2[(s + 1) % Figura2.Length]) || (Figura1[(j + 1) % Figura1.Length] == Figura2[s] && Figura1[j] == Figura2[(s + 1) % Figura2.Length]))
                                    {
                                        intern[j] = true;
                                    }
                                }
                            }
                        }
                    }
                }
                if (FiguresPoints[i, 3] == -1)
                {
                    Figures[i].intern = intern[0] && intern[1] && intern[2];
                }
                else
                {
                    Figures[i].intern = intern[0] && intern[1] && intern[2] && intern[3];
                }
            }
            return Figures;
        }
    }
}
Продолжение снизу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2015, 15:04
Ответы с готовыми решениями:

Обрисовывать на форме фигуры по заданным координатам
Доброго времени суток. Я вообще новичок с# и по этому прошу вас сильно не пинать и помочь в решении задачи. Необходимо обрисовывать на...

Отобразить кривую на форме по координатам из файла
Текстовый файл имеет пары координат графика (создать для монотонно спадающей кривой: расстояние-температура, 6-7 точек). Отобразить кривую...

Массив: отрисовка массива линий по координатам
Создать программу выполняющую действия: 1)вводить и сохранять в массиве данных введенные пользователем координаты линий {знаю что у линий...

1
1 / 1 / 1
Регистрация: 25.04.2015
Сообщений: 12
04.05.2015, 15:05  [ТС]
Класс Figure
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
159
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public abstract class Figure
    {
        public bool intern;
        public Point MassCentr;
        public abstract void Show(System.Windows.Forms.PaintEventArgs e, int i);
        public abstract void FillShow(System.Windows.Forms.PaintEventArgs e);
        public abstract void GetMassCentr();
    }
}
 
Класс Triangle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public class Triangle : Figure
    {
        public Point p1;
        public Point p2;
        public Point p3;
        public Triangle()
        {
            p1 = new Point();
            p2 = new Point();
            p3 = new Point();
        }
        public Triangle(Point p1, Point p2, Point p3)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
        }
        public Triangle(Triangle t)
        {
            this.p1 = t.p1;
            this.p2 = t.p2;
            this.p3 = t.p3;
        }
        public override void Show(System.Windows.Forms.PaintEventArgs e, int i)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 3);
            Brush b = new SolidBrush(Color.Black);
            Font f = new Font("Arial", 20);
            g.DrawLine(p, p1, p2);
            g.DrawLine(p, p2, p3);
            g.DrawLine(p, p3, p1);
            GetMassCentr();
            g.DrawString(i.ToString(), f, b, MassCentr);
        }
        public override void FillShow(System.Windows.Forms.PaintEventArgs e)
        {
            Point[] Polygon = new Point[3] { p1, p2, p3 };
            SolidBrush b1;
            if (base.intern == false)
            {
                b1 = new SolidBrush(Color.Red);
            }
            else
            {
                b1 = new SolidBrush(Color.Green);
            }
            Graphics g = e.Graphics;
            g.FillPolygon(b1, Polygon);
        }
        public override void GetMassCentr()
        {
            base.MassCentr.X = (int)((p1.X + p2.X + p3.X) / 3);
            base.MassCentr.Y = (int)((p1.Y + p2.Y + p3.Y) / 3);
        }
    }
}
 
Класс Rectangle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
 
namespace WindowsFormsApplication1
{
    public class Rectangle:Figure
    {
        public Point p1;
        public Point p2;
        public Point p3;
        public Point p4;
        public Rectangle()
        {
            p1 = new Point();
            p2 = new Point();
            p3 = new Point();
            p4 = new Point();
        }
        public Rectangle(Point p1,Point p2,Point p3,Point p4)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
            this.p4 = p4;
        }
        public Rectangle(Rectangle r)
        {
            this.p1 = r.p1;
            this.p2 = r.p2;
            this.p3 = r.p3;
            this.p4 = r.p4;
        }
        public override void Show(System.Windows.Forms.PaintEventArgs e,int i)
        {
            Graphics g = e.Graphics;
            Pen p = new Pen(Color.Black, 3);
            Brush b = new SolidBrush(Color.Black);
            Font f = new Font("Arial",20);
            g.DrawLine(p, new Point(p1.X, p1.Y), new Point(p2.X, p2.Y));
            g.DrawLine(p, new Point(p2.X, p2.Y), new Point(p3.X, p3.Y));
            g.DrawLine(p, new Point(p3.X, p3.Y), new Point(p4.X, p4.Y));
            g.DrawLine(p, new Point(p4.X, p4.Y), new Point(p1.X, p1.Y));
            GetMassCentr();
            g.DrawString(i.ToString(),f,b,MassCentr);
        }
        public override void FillShow(System.Windows.Forms.PaintEventArgs e)
        {
            Point[] Polygon = new Point[4] { p1, p2, p3, p4 };
            SolidBrush b1;
            if (base.intern == false)
            {
                b1 = new SolidBrush(Color.Red);
            }
            else
            {
                b1 = new SolidBrush(Color.Green);
            }
            Graphics g = e.Graphics;
            g.FillPolygon(b1, Polygon);
        }
        public override void GetMassCentr()
        {
            base.MassCentr.X = (int)((p1.X + p2.X + p3.X + p4.X) / 4);
            base.MassCentr.Y = (int)((p1.Y + p2.Y + p3.Y + p4.Y) / 4);
        }
    }
}
Класс Form1
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static string wayKoor, wayPoints;
        public Form1()
        {
            InitializeComponent();
        }
        bool Fill = false;
        Figure[] Figures = new Figure[File.LengthPoints];
 
        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Visible = false;
            wayKoor = "Koordinats.txt";
            wayPoints = "Figures.txt";
            Figures = File.GetFigures(wayKoor, wayPoints);
            Figures = File.SetIntern(Figures);
            button3.Enabled = true;
            button4.Enabled = false;
        }
 
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Pen p = new Pen(Color.Black, 6);
            Graphics g = e.Graphics;
            Brush b = new SolidBrush(Color.Blue);
            Font f = new Font("Arial", 14);
            for (int i = 0; i < File.LengthPoints; i++)
            {
                if (Fill)
                {
                    Figures[i].FillShow(e);
                }
                Figures[i].Show(e,i);
            }
            for (int i=0;i<File.LengthKoor;i++)
            {
                bool InEx = false;
                for (int k = 0; k < File.FiguresPoints.GetLength(0); k++)
                {
                    for (int s = 0; s < File.FiguresPoints.GetLength(1); s++)
                    {
                        if (i == File.FiguresPoints[k, s])
                        {
                            g.DrawEllipse(p, File.Koordinats[i].X - 1, File.Koordinats[i].Y - 1, 2, 2);
                            g.DrawString(i.ToString(), f, b, new Point(File.Koordinats[i].X - 26, File.Koordinats[i].Y - 20));
                            InEx = true;
                        }
                        if (InEx) { break; }
                    }
                    if (InEx) { break; }
                }
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            panel1.Visible = true;
            Fill = false;
            panel1.Invalidate();
            button4.Enabled = true;
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            Fill = true;
            panel1.Invalidate();
            button5.Enabled = true;
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            File.Save();
            button2.Enabled = true;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            panel1.Visible = false;
            wayKoor = "Koordinats.txt";
            wayPoints = "newFigures.txt";
            Figures = File.GetFigures(wayKoor, wayPoints);
            Figures = File.SetIntern(Figures);
            button4.Enabled = false;
        }
    }
}
Класс Program
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.05.2015, 15:05
Помогаю со студенческими работами здесь

Отрисовка треугольника по введенным координатам вершин
Добрый день. Помогите с кодом для отрисовки треугольника по введенным координатам (х и у) его вершин. То есть при загрузке программы,...

PyQt4. Отрисовка точек по координатам. Передача аргументов
Здравствуйте! Есть код, который отрисовывает рандомно точки, а мне нужно по определенным координатам. Координаты я получаю из файла в...

Отрисовка и поворот 3D фигуры
Мне необходимо нарисовать параллелепипед и программно его покрутить (то есть, вычислять его новые координаты и перерисовывать) Застрял я...

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

Построение фигуры по координатам
Доброго времени суток! Помогите пожалуйста, количество точек и их координаты задаются во время выполнения программы ! Нужно построить фигру!


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru