Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
1

Описать класс, представляющий треугольник

30.11.2013, 17:44. Просмотров 1586. Ответов 15
Метки нет (Все метки)

Описать класс, представляющий треугольник. Предусмотреть методы для создания объектов, перемещения на плоскости, изменения размеров и вращения на заданный угол. Описать свойства для получения состояния объекта. При невозможности построения треугольника выбрасывается исключение. Написать программу, демонстрирующую все разработанные элементы класса.
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
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            double f;
            double d;
            double x;
            double y;
            double k;
            double l;
            double r;
            
            
            Console.WriteLine("Введите значение x0 для точки А:");
            x = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки А:");
            y = Convert.ToDouble(Console.ReadLine());
 
            Point a = new Point(x, y);
            
            
            
            Console.WriteLine("Введите значение x0 для точки В:");
            x = Convert.ToSingle(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки В:");
            y = Convert.ToSingle(Console.ReadLine());
            Point b = new Point(x, y);
            
            Console.WriteLine("Введите значение x0 для точки C:");
            x = Convert.ToSingle(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки C:");
            y = Convert.ToSingle(Console.ReadLine());
            Point c = new Point(x, y);
            Triangle T = new Triangle(a, b, c);
            T.show();
            
            Console.WriteLine("Вниз сдвиг на:");
            k = Convert.ToSingle(Console.ReadLine());
            T.sd_down(k);
            T.show();
            Console.WriteLine("Влево сдвиг на:");
 
            l = Convert.ToSingle(Console.ReadLine());
 
            T.sd_left(l);
            T.show();
            Console.WriteLine("Вправо сдвиг на:");
            r = Convert.ToSingle(Console.ReadLine());
            T.sd_right(r);
            T.show();
            Console.WriteLine("Увеличение  на:");
            f = Convert.ToSingle(Console.ReadLine());
            T.sd_rad(f);
 
 
            T.show();
            Console.WriteLine("Введите угол вращения d:");
            d = Convert.ToSingle(Console.ReadLine());
 
            T.sd_alfa(d);
            T.show();
            
 
            
 
        }
    }
}
 
 
 
 class Point
    {
        public double x0, y0,x1,y1,x2,y2;
 
        public Point(double x, double y)
        {
            x0 = x;
            y0 = y;
            x1 = x;
            y1 = y;
            x2 = x;
            y2 = y;
 
        }
    }
}
 
 
class Triangle
    {
        
         public Point a { set; get; }
        public Point b { set; get; }
        public Point c { set; get; }
 
        public Triangle(Point _a, Point _b, Point _c)   //конструктор
        {
            this.a = _a; 
            this.b = _b;
            this.c = _c;
        }
        
        public void sd_right(double r)   //сдвиг вправо
        {
            
            a.x0 =a.x0 +r; b.x1 = b.x1+r; c.x2 =c.x2 +r;
            
 
        }
        public void sd_left(double l)    //сдвиг влево
        {
            a.x0 = a.x0-l; b.x1 =b.x1 -l; c.x2 =c.x2 -l;
           
 
        }
        public void sd_up(double v)  //сдвиг верх
        {
            a.y0 =a.y0 +v; b.y1 = b.y1+v; c.y2 =c.y2 +v;
 
        }
        public void sd_down(double k)    //сдвиг вниз
        {
            
            a.y0 = a.y0-k; b.y1 =b.y1 -k; c.y2 =c.y2 -k;
        }
        public double R(Point _a, Point _b)
        {
            return Convert.ToSingle(Math.Sqrt(Math.Pow(_a.x0 - _b.x1, 2) + Math.Pow(_a.y0 - _b.y1, 2)));
        }
       public void sd_alfa(double d)    //поворот на угол d
        {
            Point M = new Point((a.x0+b.x1+c.x2)/3,(a.y0+b.y1+c.y2)/3);
            a.x0 = M.x0 + Convert.ToSingle(R(M,a) * Math.Cos(d));
            a.y0 = M.y0 - Convert.ToSingle(R(M, a) * Math.Sin(d));
            b.x1 = M.x1 + Convert.ToSingle(R(M, b) * Math.Cos(d));
            b.y1 = M.y1 - Convert.ToSingle(R(M, b) * Math.Sin(d));
            c.x2 = M.x2 + Convert.ToSingle(R(M, c) * Math.Cos(d));
            c.x2 = M.x2 - Convert.ToSingle(R(M, c) * Math.Sin(d));
        }
        public void sd_rad(double f) //увелечение на r
        {
            
            a.x0 = a.x0 + f; b.x1 = b.x1 + f; c.x2 = c.x2 + f;
            a.y0 = a.y0 + f; b.y1 = b.y1 + f; c.y2 = c.y2 + f;
 
        }
 
        public void show()  //вывод координат
        {
            Console.WriteLine("a(x,y)={0},{1}\nb(x,y)={2},{3}\nc(x,y)={4},{5}", a.x0, a.y0,b.x1,b.y1,c.x2,c.y2);
            Console.ReadKey();
        }
    }
 
 
    }
помогите с методом вращения на заданный угол, а то работает неправильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2013, 17:44
Ответы с готовыми решениями:

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

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

Описать класс, представляющий треугольник
Задача:Описать класс, представляющий треугольник. Предусмотреть методы для...

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

Описать класс, представляющий треугольник
Здравствуйте, отыскал программу, но исходников к ней нету...очень нужен этот...

15
WhooogyMan
25 / 25 / 9
Регистрация: 22.09.2012
Сообщений: 116
30.11.2013, 18:00 2
1. зачем в классе Point 3 отдельных точки, имеющих одинаковые значения
2. методы передвижения можно собрать в один Move(dx, dy);
3. вращать треугольник нужно, видимо, вокруг центра вписанной окружности
это вроде он (из вашего кода)
C#
1
Point M = new Point((a.x0+b.x1+c.x2)/3,(a.y0+b.y1+c.y2)/3);
а формула вращения точки вокруг этого центра, такая должна быть
C#
1
2
X = x0 + (x - x0) * cos(a) - (y - y0) * sin(a);
Y = y0 + (y - y0) * cos(a) + (x - x0) * sin(a);
где х0 - M.x, y0 - M.y
0
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
01.12.2013, 00:00  [ТС] 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
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
class Point
    {
        public float x, y;
        public Point(float _x, float _y)
        {
            x = _x;
            y = _y;
        }
    }
}
 
 
  class Triangle
    {
 
        public Point a { set; get; }
        public Point b { set; get; }
        public Point c { set; get; }
 
        public Triangle(Point _a, Point _b, Point _c)   //конструктор
        {
            a = _a; 
            b = _b;
            c = _c;
        }
        public void sd_right(float d)   //сдвиг вправо
        {
            a.x = a.x+d; b.x = b.x+d; c.x = c.x+d;
        }
        public void sd_left(float d)    //сдвиг влево
        {
            a.x = a.x-d; b.x = b.x-d; c.x = c.x-d;
        }
        public void sd_up(float d)  //сдвиг верх
        {
            a.y = a.y+d; b.y = b.y+d; c.y = c.y+d;
        }
        public void sd_down(float d)    //сдвиг вниз
        {
            a.y = a.y-d; b.y = b.y-d; c.y = c.y-d;
        }
        public float R(Point _a, Point _b)
        {
            return Convert.ToSingle(Math.Sqrt(Math.Pow(_a.x - _b.x, 2) + Math.Pow(_a.y - _b.y, 2)));
        }
        public void sd_alfa(float d)    //поворот на угол d
        {
            Point M = new Point((a.x+b.x+c.x)/3,(a.y+b.y+c.y)/3);
            a.x = M.x + Convert.ToSingle(R(M,a) * Math.Cos(d));
            a.y = M.y - Convert.ToSingle(R(M, a) * Math.Sin(d));
            b.x = M.x + Convert.ToSingle(R(M, b) * Math.Cos(d));
            b.y = M.y - Convert.ToSingle(R(M, b) * Math.Sin(d));
            c.x = M.x + Convert.ToSingle(R(M, c) * Math.Cos(d));
            c.y = M.y - Convert.ToSingle(R(M, c) * Math.Sin(d));
        }
        public void sd_rad(float r) //увелечение на r
        {
            
            a.x = a.x + r; b.x = b.x + r; c.x = c.x + r;
            a.y = a.y + r; b.y = b.y + r; c.y = c.y + r;
        }
 
        public void show()  //вывод координат
        {
            Console.WriteLine("a(x,y)={0},{1}\nb(x,y)={2},{3}\nc(x,y)={4},{5}", a.x, a.y,b.x,b.y,c.x,c.y);
            Console.ReadKey();
        }
    };
    }
 
 float f;
            float d;
            float x;
            float y;
            float k;
            float l;
            float r;
 
 
            Console.WriteLine("Введите значение x0 для точки А:");
            x = Convert.ToSingle(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки А:");
            y = Convert.ToSingle(Console.ReadLine());
 
            Point a = new Point(x, y);
 
 
 
            Console.WriteLine("Введите значение x0 для точки В:");
            x = Convert.ToSingle(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки В:");
            y = Convert.ToSingle(Console.ReadLine());
            Point b = new Point(x, y);
 
            Console.WriteLine("Введите значение x0 для точки C:");
            x = Convert.ToSingle(Console.ReadLine());
            Console.WriteLine("Введите значение y0 для точки C:");
            y = Convert.ToSingle(Console.ReadLine());
            Point c = new Point(x, y);
            Triangle T = new Triangle(a, b, c);
            T.show();
 
            Console.WriteLine("Вниз сдвиг на:");
            k = Convert.ToSingle(Console.ReadLine());
            T.sd_down(k);
            T.show();
            Console.WriteLine("Влево сдвиг на:");
 
            l = Convert.ToSingle(Console.ReadLine());
 
            T.sd_left(l);
            T.show();
            Console.WriteLine("Вправо сдвиг на:");
            r = Convert.ToSingle(Console.ReadLine());
            T.sd_right(r);
            T.show();
            Console.WriteLine("Увеличение  на:");
            f = Convert.ToSingle(Console.ReadLine());
            T.sd_rad(f);
 
 
            T.show();
            Console.WriteLine("Введите угол вращения d:");
            d = Convert.ToSingle(Console.ReadLine());
 
            T.sd_alfa(d);
            T.show();
            
 
        }
    }
}
0
WhooogyMan
25 / 25 / 9
Регистрация: 22.09.2012
Сообщений: 116
01.12.2013, 00:17 4
вместо вот этого всего
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void sd_right(float d)   //сдвиг вправо
        {
            a.x = a.x+d; b.x = b.x+d; c.x = c.x+d;
        }
        public void sd_left(float d)    //сдвиг влево
        {
            a.x = a.x-d; b.x = b.x-d; c.x = c.x-d;
        }
        public void sd_up(float d)  //сдвиг верх
        {
            a.y = a.y+d; b.y = b.y+d; c.y = c.y+d;
        }
        public void sd_down(float d)    //сдвиг вниз
        {
            a.y = a.y-d; b.y = b.y-d; c.y = c.y-d;
вы можете написать
C#
1
2
3
4
5
6
7
8
9
public void sd_move(float dx, float dy)   //сдвиг
{
    a.x = a.x+dx;
    a.y = a.y+dy;
    b.x = b.x+dx;
    b.y = b.y+dy
    c.x = c.x+dx;
    c.y = c.y+dy;
}
это, вроде, не сложно объяснить
а повороты не изменились, я ж вам формулу в предыдущем комменте привел

Добавлено через 2 минуты
C#
1
public void sd_alfa(float d)    //поворот на угол d
вы сюда угол в градусах передаете?
потому что
C#
1
Math.Cos(d)
принимает в радианах
2
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
01.12.2013, 02:36  [ТС] 5
нужно вращать треугольник не вокруг вписанной окружности а просто в плоскости x,y относительно точки А например и вот как это реализовать в методе
0
DataPlanner
153 / 183 / 49
Регистрация: 25.11.2013
Сообщений: 978
01.12.2013, 03:13 6
Рассчитай окружность, найди центр и вращай
0
ViterAlex
6713 / 3720 / 1526
Регистрация: 11.02.2013
Сообщений: 8,214
Завершенные тесты: 3
01.12.2013, 03:33 7
Цитата Сообщение от WhooogyMan Посмотреть сообщение
это вроде он (из вашего кода)
C#
1
Point M = new Point((a.x0+b.x1+c.x2)/3,(a.y0+b.y1+c.y2)/3);
Как это ты лихо центр посчитал. А вращение правильное
0
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
01.12.2013, 04:04  [ТС] 8
неправильно считает вращение как это описать вращение без окружности а просто по плоскости , не силен я в геометрии поэтому неуверен насчет этого метода..поэтому и попросил чтобы помогли с этим методом..
0
ViterAlex
6713 / 3720 / 1526
Регистрация: 11.02.2013
Сообщений: 8,214
Завершенные тесты: 3
01.12.2013, 06:22 9
Цитата Сообщение от Lucky_7 Посмотреть сообщение
не силен я в геометрии
Что такое поворот и как его считать?
0
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
01.12.2013, 07:14  [ТС] 10
да как правильно реализовать эти повороты без окружности незнаю, ну или помогите сделать с окружностью но чтоб считало правильно
0
ViterAlex
6713 / 3720 / 1526
Регистрация: 11.02.2013
Сообщений: 8,214
Завершенные тесты: 3
01.12.2013, 07:48 11
О какой окружности ты говоришь? Для поворота нужно задать центр поворота и угол. Результатом поворота будут изменённые координаты вершин треугольника. Например, так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public void Rotate(Point center, double angle)
        {
            a.Offset(-center.X, -center.Y);//Перенос начала координат в центр вращения для упрощения формулы поворота
            a.X = (int)(a.X * Math.Cos(angle) - a.Y * Math.Sin(angle));
            a.Y = (int)(a.X * Math.Sin(angle) + a.Y * Math.Cos(angle));
            b.Offset(-center.X, -center.Y);
            b.X = (int)(b.X * Math.Cos(angle) - b.Y * Math.Sin(angle));
            b.Y = (int)(b.X * Math.Sin(angle) + b.Y * Math.Cos(angle));
            c.Offset(-center.X, -center.Y);
            c.X = (int)(c.X * Math.Cos(angle) - c.Y * Math.Sin(angle));
            c.Y = (int)(c.X * Math.Sin(angle) + c.Y * Math.Cos(angle));
            //Возвращаем начало координат в прежнее положение
            a.Offset(center); b.Offset(center); c.Offset(center);
        }
1
WhooogyMan
25 / 25 / 9
Регистрация: 22.09.2012
Сообщений: 116
01.12.2013, 13:21 12
Цитата Сообщение от ViterAlex Посмотреть сообщение
Как это ты лихо центр посчитал
это ж не я, это автор
ну из инета
Кликните здесь для просмотра всего текста

1. Центр тяжести вершин как системы трех точек:
Формулы:
m.x = (a.x + b.x + c.x) / 3;
m.y = (a.y + b.y + c.y) / 3;
m.z = (a.z + b.z + c.z) / 3; // эта строчка только для пространственного случая

если нужно вращать вокруг вершины - ставь эту вершину вместо центра вращения и изменяй координаты двух других вершин по формуле
0
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
01.12.2013, 21:14  [ТС] 13
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
class Triangle
    {
 
        public Point a { set; get; }
        public Point b { set; get; }
        public Point c { set; get; }
 
        public Triangle(Point _a, Point _b, Point _c)   //конструктор
        {
            a = _a; 
            b = _b;
            c = _c;
        }
        public void sd_right(float d)   //сдвиг вправо
        {
            a.x = a.x+d; b.x = b.x+d; c.x = c.x+d;
        }
        public void sd_left(float d)    //сдвиг влево
        {
            a.x = a.x-d; b.x = b.x-d; c.x = c.x-d;
        }
        public void sd_up(float d)  //сдвиг верх
        {
            a.y = a.y+d; b.y = b.y+d; c.y = c.y+d;
        }
        public void sd_down(float d)    //сдвиг вниз
        {
            a.y = a.y-d; b.y = b.y-d; c.y = c.y-d;
        }
        public float R(Point _a, Point _b)
        {
            return Convert.ToSingle(Math.Sqrt(Math.Pow(_a.x - _b.x, 2) + Math.Pow(_a.y - _b.y, 2)));
        }
        public void sd_alfa(float d)    //поворот на угол d
        {
            a.x = (a.x + b.x + c.x) / 3;
            a.y = (a.y + b.y + c.y) / 3;
        }
        public void sd_rad(float r) //увелечение на r
        {
            
            a.x = a.x + r; b.x = b.x + r; c.x = c.x + r;
            a.y = a.y + r; b.y = b.y + r; c.y = c.y + r;
        }
 
        public void show()  //вывод координат
        {
            Console.WriteLine("a(x,y)={0},{1}\nb(x,y)={2},{3}\nc(x,y)={4},{5}", a.x, a.y,b.x,b.y,c.x,c.y);
            Console.ReadKey();
        }
    };
    }
неправильно все равно вращает(((..как это нормально реализовать..
0
WhooogyMan
01.12.2013, 21:18
  #14

Не по теме:

все очень плохо

1
Lucky_7
1 / 1 / 1
Регистрация: 19.09.2013
Сообщений: 96
03.12.2013, 23:37  [ТС] 15
на a.Offset он ругается почему где его надо объявить..

Добавлено через 5 минут
как правильно в мой код этот метод вставить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public void Rotate(Point center, double angle)
        {
            a.Offset(-center.X, -center.Y);//Перенос начала координат в центр вращения для упрощения формулы поворота
            a.X = (int)(a.X * Math.Cos(angle) - a.Y * Math.Sin(angle));
            a.Y = (int)(a.X * Math.Sin(angle) + a.Y * Math.Cos(angle));
            b.Offset(-center.X, -center.Y);
            b.X = (int)(b.X * Math.Cos(angle) - b.Y * Math.Sin(angle));
            b.Y = (int)(b.X * Math.Sin(angle) + b.Y * Math.Cos(angle));
            c.Offset(-center.X, -center.Y);
            c.X = (int)(c.X * Math.Cos(angle) - c.Y * Math.Sin(angle));
            c.Y = (int)(c.X * Math.Sin(angle) + c.Y * Math.Cos(angle));
            //Возвращаем начало координат в прежнее положение
            a.Offset(center); b.Offset(center); c.Offset(center);
        }
Добавлено через 6 часов 45 минут
помогите с этой темой ребят,метод очень нужен
0
ViterAlex
6713 / 3720 / 1526
Регистрация: 11.02.2013
Сообщений: 8,214
Завершенные тесты: 3
04.12.2013, 01:38 16
Этот метод нужно просто вставить в твой класс. На Offset ругаться не может, если конечно a, b, c заданы как Point
0
04.12.2013, 01:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2013, 01:38

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

Описать класс, представляющий треугольник
Задача:/*Описать класс, представляющий треугольник. Предусмотреть методы для...

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


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

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

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