Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446

Хранение и редактирование фигуры

13.08.2013, 21:38. Показов 3134. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Салют!

Уже который день ломаю голову, как реализовать следующую задачу:

примитивный графический редактор, а именно, каким образом осуществить хранение и редактирование фигуры, состоящей к примеру из дуг, прямы и т.д.

Что-то вроде этого:

Каким образом, хранить эти элементы фигуры и при необходимости переместить деталь или удалить?

Заранее спс!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2013, 21:38
Ответы с готовыми решениями:

Настойки программы: редактирование и хранение
Подскажите как вставить в своё приложение настройка и и как создать форму с настройками Добавлено через 43 секунды 'Этот класс...

Редактирование фигуры
Как правильно редактировать существующие фигуры. Т.е., например, необходимо отредактировать фигуру Центробежный насос Разработчик -...

Хранение данных (добавление, редактирование, поиск, удаление) до 500МБ
Сейчас какой то конкретной задачи нет, просто стало интересно, подскажите, вот допустим есть какая то программа для учета чего либо,...

7
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
13.08.2013, 22:16
Делай их bitmap-ом, выделяй через список рядом с картинкой... Можно конечно и через наведение мыши находить этот объект, но я думаю что это геморно, придется через двойные циклы каждый объект(фигуру) перебирать на совпадение координат... Собственно не очень сложная задача, по сути...
1
Вежливость-главное оружие
 Аватар для some_name
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
14.08.2013, 01:57  [ТС]
Хмммм...

Интересная идея. Спасибо. Попробую.

Добавлено через 42 минуты
Т.е. правильно ли я понял:

Пользователь выберает, к примеру, "Рисовать квадрат".
Указывает параметры(длина стороны).
Я создаю bitmap(длина стороны Х длина стороны), на котором рисую этот квадрат.
Потом этот bitmap отображаю в pictureBox.
Хорошо. Но как быть с кругом или прямой? Мне ведь так же придется их отображать, а так как bitmap есть ничто иное как матрица битов, то получится, что я буду отрисовывать не круг, а квадрат. А это неочень хорошо, т.к. фигуры буду налазить друг на друга...

Как быть?

Заранее спс!
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
14.08.2013, 09:03
Смотря каким образом в дальнейшем предполагается их изменять, если действительно, как в Paint, то сверху верно подсказали, просто рисуй на PictureBox, пример:
C#
1
2
Graphics gh = pictureBox1.CreateGraphics();
            gh.DrawRectangle(new Pen(new SolidBrush(Color.Red)), new Rectangle(new Point(0, 0), new Size(100, 100)));
, а потом сохраняй в файл стандартным методом, например в png:
C#
1
pictureBox1.Image.Save("c:\bitmap.png", System.Drawing.Imaging.ImageFormat.Png);
Если же их предполагается использовать как, например, AutoCad использует - тут одно из двух, либо изобретать свой формат файла (или использовать xml тип), либо изучить структуру файла, для аналогичных целей, те же autoCad-овские файлы.
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
14.08.2013, 20:32
Цитата Сообщение от some_name Посмотреть сообщение
Пользователь выбирает, к примеру, "Рисовать квадрат".
Указывает параметры(длина стороны).
Вот небольшую заготовочку набросал, с этого можно продолжить, добавить перемещение объектов и фигуры, также их объединение, если нужно. Для этого думаю все-таки список в datagridView создавать со списком FF вместе
Все что нужно написать я уже представил в голове, что успел за пару часов написать и отладить выкладываю:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace MyPaint
{
    public partial class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
        public Form1()
        {
            InitializeComponent();
        }
        private void InitializeComponent()
        {
            this.Квадрат = new System.Windows.Forms.Button();
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.Круг = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
            this.SuspendLayout();
            // 
            // Квадрат
            // 
            this.Квадрат.Location = new System.Drawing.Point(49, 3);
            this.Квадрат.Name = "Квадрат";
            this.Квадрат.Size = new System.Drawing.Size(66, 23);
            this.Квадрат.TabIndex = 5;
            this.Квадрат.Text = "Квадрат";
            this.Квадрат.UseVisualStyleBackColor = true;
            // 
            // pictureBox1
            // 
            this.pictureBox1.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
            this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.pictureBox1.Location = new System.Drawing.Point(136, 56);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(357, 299);
            this.pictureBox1.TabIndex = 4;
            this.pictureBox1.TabStop = false;
            this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
            this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            // 
            // Круг
            // 
            this.Круг.Location = new System.Drawing.Point(-1, 3);
            this.Круг.Name = "Круг";
            this.Круг.Size = new System.Drawing.Size(44, 23);
            this.Круг.TabIndex = 3;
            this.Круг.Text = "Круг";
            this.Круг.UseVisualStyleBackColor = true;
            this.Круг.Click += new System.EventHandler(this.Круг_Click);
            // 
            // Form1
            // 
            this.ClientSize = new System.Drawing.Size(818, 428);
            this.Controls.Add(this.Квадрат);
            this.Controls.Add(this.pictureBox1);
            this.Controls.Add(this.Круг);
            this.Name = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
            this.ResumeLayout(false);
 
        }
 
        private Button Круг;
        private Button Квадрат;
        private PictureBox pictureBox1;
        string figur = "";
        int x, y;
        bool s = false, Draw = false;
        Point p1, p2;
        List<FF> Fig = new List<FF>();
 
        private void Круг_Click(object sender, EventArgs e)
        {
            figur = "Круг";
            pictureBox1.Invalidate();
        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (figur == "") return;
            if (e.Button.ToString() == "Left")
            {
                if (s == false)
                { p1 = new Point(e.X, e.Y); s = true; }
                p2 = new Point(e.X, e.Y);
            }
 
            pictureBox1.Invalidate();
        }
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (figur == "Круг")
                drawCirc(p1, p2, e.Graphics);
            for (int i = 0; i < Fig.Count; i++)
            {
                if (Fig[i].fig == "Круг") drawCirc(Fig[i].p1, Fig[i].p2, e.Graphics);
            }
        }
        private void drawCirc(Point p1, Point p2, Graphics g)
        {
            int xMin = (p1.X < p2.X) ? p1.X : p2.X;
            int yMin = (p1.Y < p2.Y) ? p1.Y : p2.Y;
            g.DrawEllipse(new Pen(Color.Black), xMin, yMin, Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
        }
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            Fig.Add(new FF(p1, p2, figur));
            s = false; figur = "";
            p1 = p2 = new Point(0, 0);
        }
    }
}
public class FF
{
    public Point p1, p2;
    public string fig = "";
    public FF(Point p1, Point p2, string fig)
    {
        this.p1 = p1;
        this.p2 = p2;
        this.fig = fig;
    }
}
Добавлено через 3 минуты
Вопрос понравился, года три назад хотел прогу по окнам написать(чертежи и схемы окон рисовать, для фирмы), но не знал как подступиться, а сейчас за два часа основные алгоритмы придумал... Из этой заготовки можно будет доделать...
0
39 / 37 / 8
Регистрация: 01.08.2013
Сообщений: 106
15.08.2013, 12:49
Что это за манера писать названия объектов на русском языке, это же плохой тон программирования, с родни GoTo и вечных циклов. )
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
15.08.2013, 18:36
Цитата Сообщение от onicdr Посмотреть сообщение
Что это за манера писать названия объектов на русском языке
Просто торопился, да и используются они один раз, потому ничего страшного в этом не было...
Обычно так не делаю никогда...
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
16.08.2013, 15:27
1) Изучаем класс Graphics и все его методы.
2) Для всех методов рисования изучаем их параметры
3) для каждого элемента рисования создаем свой класс для сохранения параметров.
Для некоторых и создавать не надо - для прямоугольника, эллипса есть Rect, для линии достаточно хранить массив точек.
4) Теперь не проблема создать общий класс-контейнер для всех елементов
5) мы можем выполнить рисунок отрисовав все элементы по очереди и сохранить его в виде сериализации коллекции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2013, 15:27
Помогаю со студенческими работами здесь

Редактирование параметров фигуры и положение на листе
Доброго всем времени суток! Добавляю фигуру в документ с помощью кода: With Form.Shapes .AddShape msoShapeRectangle, 50, 50,...

Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel
Всем привет! Хочу поделится наработками, которые получились в процессе реализации своих задач. Отдельная благодарность! Андрей VG, за...

Вводить название фигуры, выводить формулу для вычисления площади этой фигуры
Вводить название фигуры (треугольник, квадрат, ромб, прямоугольник) выводить формулу для вычисления площади этой фигуры.

Наложить чертёж плоской фигуры на проекцию этой фигуры
Стоит задача наложить чертёж земельного участка на фотографию этого участка. Участок обозримого размера и целиком влазит в кадр. Таким...

Передвижение фигуры при клике на область внутри фигуры
Есть прямоугольник 100 на 50. При удерживании мышки фигура передвигается как карта в пасьянсе. При отпуске фиксируется. Хотел бы...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru