С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 146

Нужно в форме разработать класс "Плоскость" с использованием конструкторов и деструкторов

26.02.2019, 13:54. Показов 1252. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
мне нужно сделать форму с использованием ооп, конструкторов, деструкторов, классов, объектов:
задание:
Объект "Плоскость".
поля - для сохранения уравнения плоскости.
метод 1 - введение и вывод коэффициентов уравнения плоскости.
метод 2 - проверка принадлежит ли точка плоскости.
метод 3 - нахождении проэкции точки на плоскость.
метод 4 - нахождение точки пересечения прямой с плоскостью
метод 5 - установление паралельности с другой плоскостью.

я не понимаю как это сделать в формах с использованием элементов управление. нужен код + визуальная форма.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2019, 13:54
Ответы с готовыми решениями:

Задача с использованием конструкторов и деструкторов классов Разработать класс для объекта Product:
Задача с использованием конструкторов и деструкторов классов. Разработать класс для объекта Product: Наименование, Производитель, Цена,...

Задание с использованием конструкторов и деструкторов
Нужна ваша помощь. Само задание: Разработать класс - СТУДЕНТ. В закрытой части определить данные: фамилия, номер зачетной книжки,...

Ошибки в программе с использованием конструкторов/деструкторов
Приветы Есть код: #include <iostream> #include <cmath> #include <stdlib.h>

4
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
26.02.2019, 13:59
Цитата Сообщение от Anton124 Посмотреть сообщение
я не понимаю как это сделать в формах
Классу как бэ без разницы где он будет работать - в консоли, в формах или еще где то...

Для начала, напишите код класса "Плоскость", в котором будет
Цитата Сообщение от Anton124 Посмотреть сообщение
поля - для сохранения уравнения плоскости.
метод 1 - введение и вывод коэффициентов уравнения плоскости.
метод 2 - проверка принадлежит ли точка плоскости.
метод 3 - нахождении проэкции точки на плоскость.
метод 4 - нахождение точки пересечения прямой с плоскостью
метод 5 - установление паралельности с другой плоскостью.
А потом уже поможем с использованием этого класса в WinForms
0
0 / 0 / 0
Регистрация: 01.11.2018
Сообщений: 146
26.02.2019, 14:05  [ТС]
я не знаю как написать класс "Плоскость", это сложно
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
26.02.2019, 14:25
Цитата Сообщение от Anton124 Посмотреть сообщение
это сложно
Ну, программирование - это вообще непросто))) Если у Вас возникают сложности с такими заданиями, возможно, имеет смысл сменить специальность? Дальше проще не будет!

Цитата Сообщение от Anton124 Посмотреть сообщение
я не знаю как написать класс
Читайте: Классы. Объектно-ориентированное программирование
0
70 / 44 / 28
Регистрация: 14.02.2017
Сообщений: 126
27.02.2019, 18:45
Добрый день!

Вот код, который Вам поможет. Он не совсем по заданию:
у Вас структура в задании попроще - видимо имеется ввиду построение класса плоскости напрямую подстановкой коэффициентов в уравнение плоскости. Здесь плоскость задается 3 точками - при инициализации в форме надо вводить координаты каждой из трех точек вручную;
поэтому здесь есть класс Point3D, который и описывает точку в трехмерном пространстве с перегруженными Equals и GetHashCode;
в классе Plane соответственно расчетные методы отстроены на основе Point3D
нет 2 последних методов - пересечение с прямой и параллельность плоскостей - не стал возиться, но можно сделать по аналогии
самое главное - процесс передачи данных из класса Plane построен нормально на основе механизма событий:
- в классе Plane создается стандартное событие EventHandler, затем в методе, который что-то делает с данными, запускается метод, который вызывает срабатывание события. В классе Form1.cs подписываемся на событие, прописываем обработчик события, в котором получаем объект, вызвавший событие, и и устанавливаем текстовые поля из свойств класса, в которых будет отображаться результат вычислений
в форме все со стандартными названиями и номерами. Кстати, не знаю как Вам ее отправить здесь. На всякий случай прикреплю архив.
Класс Point3D:
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
    class Point3D
    {
        double x;
        public bool IsValidX(double x)
        {
            if (x > -25000 && x < 25000)
                return true;
            else
                return false;
        }
        public double X
        {
            get
            {
                return x;
            }
            set
            {
                if (!IsValidX(value))
                    throw new ArgumentException("Значение вне пределов", "value");
                
                x = value;
            }
        }
        double y;
        public bool IsValidY(double y)
        {
            if (y > -25000 && y < 25000)
                return true;
            else
                return false;
        }
        public double Y
        {
            get
            {
                return y;
            }
            set
            {
                if (!IsValidY(value))
                    throw new ArgumentException("Значение вне пределов", "value");
                
                y = value;
            }
        }
        double z;
        public bool IsValidZ(double z)
        {
            if (z > -25000 && z < 25000)
                return true;
            else
                return false;
        }
        public double Z
        {
            get
            {
                return z;
            }
            set
            {
                if (!IsValidZ(value))
                    throw new ArgumentException("Значение вне пределов", "value");
                
                z = value;
            }
        }
        public Point3D() { }
 
        public Point3D(double x, double y, double z)
        {
            if (!IsValidX(X))
                throw new ArgumentException("Значение вне пределов", "X");
            if (!IsValidY(Y))
                throw new ArgumentException("Значение вне пределов", "Y");
            if (!IsValidZ(Z))
                throw new ArgumentException("Значение вне пределов", "Z");
            X = x;
            Y = y;
            Z = z;
        }
        // переопределим Equals и GetHashCode - это важно
        public override bool Equals(object obj)
        {
            var point3D = obj as Point3D;
            if (point3D != null && point3D.X == this.X && point3D.Y == this.Y && point3D.Z == this.Z)
                return true;
            else
                return false;
        }
        public override int GetHashCode()
        {
            int hashcode = X.GetHashCode();
            hashcode = 31 * hashcode + Y.GetHashCode();
            hashcode = 31 * hashcode + Z.GetHashCode();
            return hashcode;
        }
    }
Класс Plane
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
    class Plane : Point3D
    {
        //из класса в форму
        public event EventHandler GetDataToForm;//первые две кнопки
        public event EventHandler GetDataToForm1;//третья кнопка  
        //свойства   
        public Point3D P1 { get; set; }//точка 1 для построения плоскости
        public Point3D P2 { get; set; }// точка 2 для построения плоскости
        public Point3D P3 { get; set; }//точка 3 для построения плоскости
        public Point3D N { get; set; }//направляющий вектор 
        public string Equation { get; set; }//текстовая строка уравнения
        public double D { get; set; }//свободный из уравнения плоскости
        public string PointInPlane { get; set; }//для метода принадлежности точки плоскости
        public Point3D ProectionPointInPlane { get; set; }//для метода проекции на плоскость точки
 
        public Plane() { }//ктор без параметров
 
        public Plane(Point3D p1, Point3D p2, Point3D p3)//ктор с параметрами
        {
            P1 = p1;
            P2 = p2;
            P3 = p3;
            N = N;
            Equation = GetEquation(P1, P2, P3);
        }
        //метод построения уравнения плоскости
        public string GetEquation(Point3D p1, Point3D p2, Point3D p3)
        {            
            //вычисляем координаты векторов Р1Р2 и Р1Р3
            Point3D p1p2 = new Point3D( p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z );
            Point3D p1p3 = new Point3D( p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z );
            //вычисление нормального вектора плоскости n
            Point3D n = new Point3D(p1p2.Y * p1p3.Z - p1p2.Z * p1p3.Y, p1p2.Z * p1p3.X - p1p2.X * p1p3.Z, p1p2.X * p1p3.Y - p1p2.Y * p1p3.X);
            //получаем уравнение
            double kX = n.X;            
            double kY = n.Y;            
            double kZ = n.Z;            
            double d = -n.X * p1.X - n.Y * p1.Y - n.Z * p1.Z;            
            N = n;
            D = d;
            string equation = $"{Convert.ToString(kX)}x {PlusOrMinus(kY)} {Convert.ToString(kY)}y {PlusOrMinus(kZ)} {Convert.ToString(kZ)}z {PlusOrMinus(d)} {Convert.ToString(d)} = 0";
            Equation = equation;
            //запуск метода срабатывания события
            OnGetDataToForm();
            return equation;
        }
        //для знаков в выводимом уравнении плоскости
        public char PlusOrMinus(double a)
        {
            if (a >= 0)
                return '+';
            else
                return ' ';
        }
        //принадлежит ли точка плоскости
        public bool IsPoint3DInPlane(Point3D p)
        {
            if (N.X * p.X + N.Y * p.Y + N.Z * p.Z + D == 0)
            {
                PointInPlane = "Да";
                //запуск метода срабатывания события
                OnGetDataToForm();
                return true;
            }
            else
            {
                PointInPlane = "Нет";
                //запуск метода срабатывания события
                OnGetDataToForm();
                return false;
            }                
        }
        //проекция точки на плоскость
        public Point3D GetProectionPoint3DInPlane(Point3D p)
        {
            //составим уравнения прямой, проходящей через нашу точку перпендикулярно плоскости
            //направляющий вектор N у нас уже есть
            //составим матрицу для решения методом Крамера
            //определитель
            double opr = ((- N.Y) * (- N.Z) * N.Z) - (N.X * (- N.Z) * 0) + (N.X * N.Y * N.X) + (0 * N.Y * 0) - (0 * N.X * N.Z) - (N.Y * N.Y * (- N.Y));
            //свободные члены
            double sv1 = p.Y * N.X - N.Y * p.X;
            double sv2 = N.Y * p.Z - N.Z * p.Y;
            double sv3 = -D;
            //условие существования решения
            if (opr != 0)
            {
                //расчеты идут с погрешностью из-за деления, поэтому если подставить резкльтат в уравнение плоскости, то совсем-совсем ровненько не получается
                double deltaX = (sv1 * (- N.Z) * N.Z) - (sv3 *(- N.Z) * 0) + (N.X * N.Y * sv3) + (sv2 * N.Y * 0) - (sv2 * N.X * N.Z) - (N.Y * N.Y * sv1);
                double deltaY = - (N.X * sv2 * 0) + ((- N.Y) * sv2 * N.Z) + (sv1 * N.Y * N.X) + (0 * sv3 * 0) - (0 * sv1 * N.Z) - (sv3 * N.Y * (- N.Y));
                double deltaZ = ((-N.Y) * (-N.Z) * sv3) - (N.X * (-N.Z) * sv1) + (N.X * sv2 * N.X) + (0 * N.Y * sv1) - (0 * N.X * sv3) - (N.Y * sv2 * (-N.Y));
                double kramerX = deltaX / opr;
                double kramerY = deltaY / opr;
                double kramerZ = deltaZ / opr;
                Point3D neoPoint = new Point3D(Math.Round(kramerX, 2), Math.Round(kramerY, 2), Math.Round(kramerZ, 2));
                ProectionPointInPlane = neoPoint;
                //запуск метода срабатывания события
                OnGetDataToForm1();
                return neoPoint;
            }
            else
            {
                //запуск метода срабатывания события
                OnGetDataToForm1();
                return null;
            }
        }
        //пересечение плоскости с прямой
        //пересечение или параллельность с другой плоскостью
 
        //срабатывание события
        public void OnGetDataToForm()
        {
            GetDataToForm?.Invoke(this, EventArgs.Empty);
        }
        //срабатывание события
        public void OnGetDataToForm1()
        {
            GetDataToForm1?.Invoke(this, EventArgs.Empty);
        }
    }
класс 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
    public partial class Form1 : Form
    {
        Plane plane = new Plane();
 
        public Form1()
        {
            InitializeComponent();
            button1.Click += delegate
            {
                //сразу берем данные из боксов
                Point3D p1 = new Point3D
                (
                    Convert.ToDouble(textBox1.Text),
                    Convert.ToDouble(textBox2.Text),
                    Convert.ToDouble(textBox3.Text)
                );
                Point3D p2 = new Point3D
                (
                    Convert.ToDouble(textBox4.Text),
                    Convert.ToDouble(textBox5.Text),
                    Convert.ToDouble(textBox6.Text)
                );
                Point3D p3 = new Point3D
                (
                    Convert.ToDouble(textBox7.Text),
                    Convert.ToDouble(textBox8.Text),
                    Convert.ToDouble(textBox9.Text)
                );   
                //подписываемся на событие (которое без цифири 1 в конце)             
                plane.GetDataToForm += delegate (object sender, EventArgs e) { P_GetDataToForm(sender, e); };
                //запускаем метод в котором прописан метод для срабатывания события
                plane.GetEquation(p1, p2, p3);
            };
            button2.Click += delegate
            {
                //сразу берем данные из боксов
                Point3D p = new Point3D
                (
                    Convert.ToDouble(textBox11.Text),
                    Convert.ToDouble(textBox12.Text),
                    Convert.ToDouble(textBox13.Text)
                );
                // подписываемся на событие (которое без цифири 1 в конце) 
                plane.GetDataToForm += delegate (object sender, EventArgs e) { P_GetDataToForm(sender, e); };
                //запускаем метод в котором прописан метод для срабатывания события
                plane.IsPoint3DInPlane(p);
            };
            button3.Click += delegate 
            {
                //сразу берем данные из боксов
                Point3D p = new Point3D
                (
                    Convert.ToDouble(textBox14.Text),
                    Convert.ToDouble(textBox15.Text),
                    Convert.ToDouble(textBox16.Text)
                );
                //подписываемся на событие 
                plane.GetDataToForm1 += delegate (object sender, EventArgs e) { P_GetDataToForm1(sender, e); };
                //запускаем метод в котором прописан метод для срабатывания события
                plane.GetProectionPoint3DInPlane(p);
            };
        }
        //здесь все сваленов одну кучу, что некрасиво - это для баттон1 и баттон2
        private void P_GetDataToForm(object sender, EventArgs e)
        {
            //получаем объект вызвавший событие
            Plane plane = sender as Plane;
            //устанавливаем текстовое поле из свойства класса
            textBox10.Text = plane.Equation;
            label17.Text = plane.PointInPlane;
        }
        //для баттон 3
        private void P_GetDataToForm1(object sender, EventArgs e)
        {
            //получаем объект вызвавший событие
            Plane plane = sender as Plane;
            //устанавливаем текстовое поле из свойства класса            
            textBox17.Text = Convert.ToString(plane.ProectionPointInPlane.X);
            textBox18.Text = Convert.ToString(plane.ProectionPointInPlane.Y);
            textBox19.Text = Convert.ToString(plane.ProectionPointInPlane.Z);
        }
        //это не убирай, если возиться и вычищать не будешь, здесь случайно накнопал
        private void button1_Click(object sender, EventArgs e)
        {
 
        }
    }
Вложения
Тип файла: rar WinFormPlane.rar (63.7 Кб, 9 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2019, 18:45
Помогаю со студенческими работами здесь

Использование конструкторов и деструкторов
Решить в консольном режиме: Дан набор из N вещественных чисел. Проверить, образует ли данный набор возрастающую последовательность. Если...

использование конструкторов и деструкторов
разработать конструкторы и деструктор для заданного класса. Осуществить инициализацию объектов класса с помощью конструктора. объявлять...

Использование конструкторов и деструкторов
Решить задачу в консольном режиме Даны целые числа K, N и набор из N целых чисел. Если в наборе присутствует число, меньшее K, то...

Правильное использование конструкторов и деструкторов
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class Worker {public: ...

Создание класса, конструкторов и деструкторов в С++
Класс товара Базовый класс (товар): Переменные: Название, производитель, цена. Конструкторы: по умолчанию, с параметрами и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru