Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448

Градусы и радианы. Поворот объекта

15.11.2014, 00:06. Показов 2968. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: сделать призму, которая должна крутится, но я остановился на её прорисовке, ибо что-то не так с углами.
Снчала я думал, что функции sin() и cos() возвращают значение синуса и косинуса указаного угла в градусах и получилось то, что на первом рисунке (верний многоугольник перевёрнут, ибо индексы не совпадают). Препод сказал, что кажись надо задавать в радианах и я удостоверился этому http://msdn.microsoft.com/ru-r... .110).aspx . Но когда перевёл градусы в радианы - получился какой-то хаос, а не призма (рисунок два). Мой алгоритм увидите в комментариях
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
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.Threading;
 
namespace _3D
{
    public partial class Form1 : Form
    {
        Pen p = new Pen(Brushes.Black,3);
        int n = new int(); //количество граней
        int D = 300; //даметр многоугольника (основы призмы)
        double[] x = new double[100]; //координаты
        double[] y = new double[100];
        double[] z = new double[100];
        int dist = 150; //дистанция для проэкции
        int h = 200; //высота призмы
        double[] dx = new double[100];//преобразованные координаты
        double[] dy = new double[100];
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
           
        }
 
        private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            if (n < 3) MessageBox.Show("Error!\nNumber of faces < 3");
            else
            {
                Graphics g = e.Graphics;
              //  g.DrawEllipse(p, 75, 75, 150, 150);
                for (int i = 0; i < n; i++)//поиск координат вершин многоугольника
                {
                    x[i] = 150 + (D / 2) * Math.Cos(2 * i * Math.PI / n);
                    y[i] = 150 + (D / 2) * Math.Sin(2 * i * Math.PI / n);
                }
 
 
                for (int i = 0; i < 2 * n; i++)//создание нового многоугольника + z-координаты
                {
                    if (i >= n) { x[i] = x[i-n]; y[i] = y[i-n]; z[i] = h; }
                    else z[i] = -h;
                }
 
                for (int i = 0; i < 2 * n; i++)//поворот призмы по оси Х на 90 градусов
                {
                    double[] rad = new double[2] {90*Math.PI/180,250*Math.PI/180};//перевод в радианы
                    if (i < n)
                    {
                        y[i] = y[i] * Math.Cos(90) + (-1) * z[i] * Math.Sin(90); //в градусах
                        z[i] = z[i] * Math.Sin(90) + z[i] * Math.Cos(90); //14.11.2014
                      /*  y[i] = y[i] * Math.Cos(rad[0]) + (-1) * z[i] * Math.Sin(rad[0]);
                          z[i] = z[i] * Math.Sin(rad[0]) + z[i] * Math.Cos(rad[0]); */ //в радианах
                    }
                    else
                    {
                      /*  y[i] = y[i] * Math.Cos(rad[1]) + (-1) * z[i] * Math.Sin(rad[1]);
                        z[i] = z[i] * Math.Sin(rad[1]) + z[i] * Math.Cos(rad[1]);*/ //в радианах
                        y[i] = y[i] * Math.Cos(250) + (-1) * z[i] * Math.Sin(250);// ну понятно
                        z[i] = z[i] * Math.Sin(250) + z[i] * Math.Cos(250);
 
                    }
                }
 
                  for (int i = 0; i < 2 * n; i++)//обнуление z
                {
                  /*  dx[i] = 220 + x[i] * dist / (z[i] + dist);
                    dy[i] = 213.5 - y[i] * dist / (z[i] + dist);*/ //точно формулу не знаю, ибо не искал в нете,а сам выводил
                     dx[i] = 220+x[i]*z[i]/(dist-z[i]);// но кажись эта правильней
                      dy[i] = 213.5+y[i] * z[i] / (dist - z[i]);
                }
 
                  for (int i = 0; i < n; i++)//вывод многоугольника 1
                  {
                      if (i == n - 1)
                          g.DrawLine(p, (float)dx[0], (float)dy[0], (float)dx[n - 1], (float)dy[n - 1]);
                      else
                          {
                      PointF point1 = new PointF((float)dx[i], (float)dy[i]);
                      PointF point2 = new PointF((float)dx[i + 1], (float)dy[i + 1]);
                      g.DrawLine(p, point1, point2);
                          }
                  }
                  for (int i = n; i < 2*n; i++)//вывод многоугольника 2
                  {
                      if (i == 2*n - 1)
                          g.DrawLine(p, (float)dx[n], (float)dy[n], (float)dx[2*n - 1], (float)dy[2*n - 1]);
                      else
                      {
                          PointF point1 = new PointF((float)dx[i], (float)dy[i]);
                          PointF point2 = new PointF((float)dx[i + 1], (float)dy[i + 1]);
                          g.DrawLine(p, point1, point2);
                      }
                  }
                  for (int i = 0; i < n; i++)//соединение вершин многоугольника
                  {
                      PointF point1 = new PointF((float)dx[i], (float)dy[i]);
                      PointF point2 = new PointF((float)dx[i + n], (float)dy[i + n]);
                      g.DrawLine(p, point1, point2);
                      
                  }
 
                  for (int i = 0; i < 2 * n; i++)//индексы точек для проверки
                  {
                      String drawString = Convert.ToString(i);
                      Font drawFont = new Font("Arial", 16);
                      SolidBrush drawBrush = new SolidBrush(Color.Red);
                      PointF drawPoint = new PointF((float)dx[i], (float)dy[i]);
                      e.Graphics.DrawString(drawString, drawFont, drawBrush, drawPoint);
                  }
            }
        }
 
        private void button7_Click(object sender, EventArgs e)
        {
            n = Convert.ToInt32(textBox2.Text);
            pictureBox1.BackColor = Color.White;
            pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
        }
       
    }
}
Почему в градусах "правильней" (визуально), но всё-равно с индексами что-то не так? Где я допустил ошибку?
Миниатюры
Градусы и радианы. Поворот объекта   Градусы и радианы. Поворот объекта  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2014, 00:06
Ответы с готовыми решениями:

радианы градусы
Есть 2 радиобаттана как сделать чтобы при нажатии 2го результат выходил в градусах (sin,cos,tg) в edit1 ,а 1го обратно в радианы?

Градусы\Радианы
кто нить подскажите как мне в МАТКАДЕ с градусами(или радианами) посчитать,как там это хоть записывать для расчета,чем пользоваться? ...

Радианы в градусы.
Вопрос, конечно, идиотский. Никак не получается правильно перевести. Пробывал и формулу : rad * 180/pi и функцию radtograd, ничего. ...

9
311 / 309 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
15.11.2014, 09:24
А в строках 62-63 и далее в чем у Вас углы заданы?
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
15.11.2014, 12:37  [ТС]
Цитата Сообщение от kontuPauk Посмотреть сообщение
А в строках 62-63 и далее в чем у Вас углы заданы?
Якобы в градусах, но я понял что правильней повернуть нижний многоугольник на 270, а не 90, но тогда получается какой-то бред.
0
311 / 309 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
15.11.2014, 13:52
Если Вам преподаватель не указ, может хоть Microsoft авторитетен
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
16.11.2014, 04:26
Я не пойму как ты поворачиваешь. Поясни на словах. Для поворота на точки на заданный угол относительно другой точки лучше пользоваться матрицами преобразований. Но, чтобы подсказать, как это делать, я должен понимать что и относительно чего ты вращаешь в данном случае
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
17.11.2014, 01:44  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Я не пойму как ты поворачиваешь. Поясни на словах. Для поворота на точки на заданный угол относительно другой точки лучше пользоваться матрицами преобразований. Но, чтобы подсказать, как это делать, я должен понимать что и относительно чего ты вращаешь в данном случае
Поворачиваю относиительно оси ОХ.Формулу здесь брал.
Получается так: 1)рисую многоугольник на оси ОХ
2)удлиняю его, то есть создаю другой (
C#
1
2
3
4
5
for (int i = 0; i < 2 * n; i++)//создание нового многоугольника + z-координаты
                {
                    if (i >= n) { x[i] = x[i-n]; y[i] = y[i-n]; z[i] = h; }
                    else z[i] = -h;
                }
)
3) поворачиваю его по оси ОХ на 90 градусов
( ну и прорисовки идут)

Добавлено через 27 секунд
Цитата Сообщение от kontuPauk Посмотреть сообщение
Если Вам преподаватель не указ, может хоть Microsoft авторитетен
Преподаватель сказал то же, что и на сайте майкрософта написано.
0
311 / 309 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
17.11.2014, 07:17
Я одного не понимаю: почему тогда в приведенном Вами фрагменте кода где-то Вы функции перевели на радианы, а где-то оставили в градусах?
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
17.11.2014, 12:18  [ТС]
Цитата Сообщение от kontuPauk Посмотреть сообщение
Я одного не понимаю: почему тогда в приведенном Вами фрагменте кода где-то Вы функции перевели на радианы, а где-то оставили в градусах?
В этом коде, что я выложи,л только в градусах, ибо "в радианах" я закомментировал.
0
311 / 309 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
17.11.2014, 13:56
Строки 46-47 - в радианах, строки 62-63 - в градусах.
Для начала наведите порядок в своем коде.
1
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
17.11.2014, 15:03  [ТС]
Цитата Сообщение от kontuPauk Посмотреть сообщение
Строки 46-47
Я за них вообще забыл. Благодарю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2014, 15:03
Помогаю со студенческими работами здесь

Радианы и градусы
формула x = r * sin(i) + n даёт результат как я понимаю в радианах. Как получать тоже но в градусах?

Перевести градусы в радианы
Перевести градусы в радианы

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

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

Написать функцию,которая переводит градусы в радианы
Дорогие программисты! Помогите мне пожалуйста в Fre Pascale:( думаю для вас это будет не сложно,а для меня вообще нечего не понятно,до...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru