Начертите квадрат. Выполните поворот этого квадрата на 45 градусов по часовой стрелке вокруг одной из вершин

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Повернуть точки квадрата?
Допустим есть квадрат. Сейчас его угол поворота равен 0. Одна из его точек при угле 0 находится на координате (-0.5; 0.0; 0.5). Теперь допустим я его хочу повернуть на 45.0 градусов по R(otation)Y (Y высота)
Вот начальное положение (вид сверху):

И вот эти координаты ? мне нужно найти исходя из угла 45.

Ну и можно пожалуйста формулу для поворота по RX, RZ (я так понимаю там нужно как-то с sin cos tan играться). Спасибо всем.
- Вопрос задан более трёх лет назад
- 2063 просмотра
Комментировать
Решения вопроса 1
xmoonlight @xmoonlight
https://sitecoder.blogspot.com
Вместо Y — подставьте Z и получите то, что нужно Вам.
Поворот вокруг центра:
X = x * cos(alpha) — y * sin(alpha);
Y = x * sin(alpha) + y * cos(alpha);
Общая формула:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
Повернуть квадрат на 45 градусов
В задании надо нарисовать ромб, но один знакомый подсказал, что модно сделать квадрат, а затем повернуть его на 45 градусов и получить ромбик (скорее, просто для того, чтоб визуально получился ромбик). В итоге, все вышло, но как повернуть квадратик, я так и не понял. Есть ли какая-нибудь функция, чтоб так сделать, или может кто-нибудь сможет подсказать как просто ромб сделать?
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
using System; using System.Drawing; using System.Windows.Forms; namespace WinFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitializeComponent(); brush = brush1; KeyPreview = true; } int sec = 0; //таймер int w = 40, h = 40; //ширина и высота прямоугольника int x = 1, y = 100; //координаты прямоугольника при запуске программы int dx = 5; //добавление по оси x int dy = 5; //добавление по оси y int a; public enum STATUS { Left, Right, Up, Down }; //направления движения STATUS flag; //флаг изменения направления движения SolidBrush brush1 = new SolidBrush(Color.Red); // кисть SolidBrush brush2 = new SolidBrush(Color.Blue); // кисть SolidBrush brush; Rectangle rc; //прямоугольная область, в которой находиться фигура public int MySpeed { get{ return 100 - timer1.Interval; } set{ timer1.Interval = 100 - value; } } public int track1 { get{ return a; } set{ a = value; } } //get и set для цвета в прямом направлении public Color MyColor1 { get{ return brush1.Color; } set{ brush1.Color = value; } } //get и set для цвета в обратном направлении public Color MyColor2 { get{ return brush2.Color; } set{ brush2.Color = value; } } //get и set для задачи направления public STATUS myflag { get{ return flag; } set{ flag = value; } } //get set для Enabled кнопки 2, чтобы при запущеном меню настрйоки кнопка блокировалась. public bool myButton { get{ return button2.Enabled; } set{ button2.Enabled = value; } } private void timer1_Tick(object sender, EventArgs e) { sec++; // секунды //label1.Text = "Скорость: " + (track1 + 1); rc = new Rectangle(x, y, w, h); // размер прямоугольной области this.Invalidate(rc, true); // вызываем прорисовку области if (flag == STATUS.Left) // движение влево x -= dx; if (flag == STATUS.Right) // движение вправо x += dx; if (flag == STATUS.Up) // движение вверх y -= dy; if (flag == STATUS.Down) // движение вниз y += dy; if (x >= (this.ClientSize.Width - w)){ // если достигли правого края формы //dodelat flag = STATUS.Left; // меняем статус движения на левый brush = brush2; } else if (x 1){ // если достигли левого края формы flag = STATUS.Right; // меняем статус движения на правый brush = brush1; } if (y >= (this.ClientSize.Height - w)){ // если достигли нижнего края формы flag = STATUS.Up; // меняем статус движения на вверх brush = brush2; } else if (y 1){ // если достигли вверхнего края формы flag = STATUS.Down; // меняем статус движения на нижний brush = brush1; } rc = new Rectangle(x, y, w, h); // новая прямоугольная область this.Invalidate(rc, true); // вызываем прорисовку этой области } private void Form1_Paint(object sender, PaintEventArgs e) { e.Graphics.FillRectangle(brush, rc); } private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape){ this.Close(); } } private void button1_Click(object sender, EventArgs e) { if (button1.Text == "Стоп"){ timer1.Stop(); button1.ForeColor = Color.Green; button1.Text = "Начать"; } else if (button1.Text == "Начать"){ timer1.Start(); button1.ForeColor = Color.Red; button1.Text = "Стоп"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Owner = this; form2.Show(); button2.Enabled = false; } } }
Как вычислить новую ширину квадрата, если повернуть его на 45 градусов?
Имеется блок, к примеру, шириной и высотой 100px. При помощи transform: rotate(45deg) я поворачиваю его на 45 градусов и, разумеется, блок занимает больше пространства как по горизонтали так и по вертикали. Так вот, как можно вычислить на уровне скрипта новую ширину и высоту? Должен же быть какой то алгоритм!?
- Вопрос задан более трёх лет назад
- 421 просмотр
2 комментария
Простой 2 комментария

Конечно есть такой алгоритм. Его изучают в 7 классе средней школы. Тема «прямоугольный треугольник», предмет «геометрия».
diadiafiodor @diadiafiodor

Вот теорема с доказательством
Решения вопроса 1


Извиняюсь, если не прав, но если это квадрат, то значит вам нужно найти просто длину диагонали.
Т.к. квадрат вы повернули, то грубо говоря, ширина = диагонали.