Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 25.07.2017
Сообщений: 12

Как задать угол поворота прямоугольника(важно именно его)

02.08.2017, 21:15. Показов 4583. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если подключаю модуль abcobjects , то угол поворота angle нашёл только для правильной фигуры типа regularpolygonABC, а как с прямоугольником быть? Заранее спасибо за ответы
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2017, 21:15
Ответы с готовыми решениями:

Как задать угол поворота оружия в 2D платформере
2D платформер, вид с боку. Есть скрипт оружия, который задаёт направление ствола (управляется курсором мыши). Когда игрок смотрит...

Создайте функцию, вычисляющую координаты вектора после поворота его на угол а
Всем привет! Помогите, пожалуйста, выполнить задания. Я сделал готовый вариант (1), но это не функция, как сделать ее, я не знаю. ...

Как посчитать угол поворота?
Даны координаты 4 точек, Подскажите пожалуйста как вычислить углы поворота квадрата по 3 осям(XYZ)?

12
02.08.2017, 22:14

Не по теме:

Судя по опыту этой темы, заранее благодарить - это не очень тема... :)

0
0 / 0 / 0
Регистрация: 25.07.2017
Сообщений: 12
02.08.2017, 23:14  [ТС]
Просто последний штрих в задаче остаётся. Тоже искал на различных источниках. В справке паскаля только для правильных фигур явно прописано, как повернуть
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
03.08.2017, 10:21
Цитата Сообщение от space_for_mind Посмотреть сообщение
типа regularpolygonABC
Не "типа", а только для этого класса возможно вращение. В силу особенностей отрисовки (рисуется объект этого класса очень просто: используя полярную систему координат, и использовать угол труда не составляет. Все остальные объекты полярную СК не используют, и вращение их не реализовано)
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
03.08.2017, 10:38
Можно вращать просто нарисованный прямоугольник.
0
0 / 0 / 0
Регистрация: 25.07.2017
Сообщений: 12
03.08.2017, 12:23  [ТС]
Спасибо за ответы. Вас понял.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
05.08.2017, 11:27
Цитата Сообщение от Puporev Посмотреть сообщение
Можно вращать просто нарисованный прямоугольник.
Добавлю. Вращение через формулы делается:
xc = x + r * cos(angle);
yc = y + r * sin(angle);

(cx, cy) - точка относительно которой идет вращение, r - длины отрезков, соединяющие левую верхнюю и правую нижнюю точки с центром прямоугольника.
Но, обратите внимание, что угол поворота точек относительно центра тоже надо учитывать, то есть:
xc = x + r * cos(angle+alpha);
yc = y + r * sin(angle+alpha);

Где alpha - угол на который поворачивается прямоугольник, angle - угол поворота для каждой точки относительно его центра. Но так как вращение идет относительно центра, то угол поворота второй точки относительно центра на 180 градусов больше (или меньше). Здесь без разницы.

Но никто не мешает и вращать саму систему координат - то же вариант. Например - хотите повернуть прямоугольник на 45 градусов. Берете, двигайте систему координат в его центр, поворачиваете. Рассчитываете новые координаты угловых точек прямоугольника (левой верхней и правой нижней): (-width / 2, -height / 2) и (width / 2, height / 2) соответственно. Далее - просто рисуете прямоугольник.

Добавлено через 2 минуты
После отрисовки возвращаете стандартную систему координат.

Добавлено через 1 минуту
Цитата Сообщение от space_for_mind Посмотреть сообщение
Просто последний штрих в задаче остаётся. Тоже искал на различных источниках. В справке паскаля только для правильных фигур явно прописано, как повернуть
А еще вариант - написать свой модуль с поддержкой поворотов и других преобразований. Труда не составит.

Добавлено через 7 минут
(cx, cy) - точка относительно которой идет вращение
Не то сказал. Это новые координаты точки после вращения.

Добавлено через 43 секунды
А x и y - координаты центра.
0
0 / 0 / 0
Регистрация: 25.07.2017
Сообщений: 12
11.08.2017, 00:32  [ТС]
Спасибо. Интересная идея
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
12.08.2017, 09:03
Вращение прямоугольника вокруг центра.
Pascal
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
uses graphABC;
type tpoint=record
            x,y:integer;
            u:real;
            end;
     mas=array[1..5] of tpoint;       
procedure rect(m:mas);
begin
line(m[1].x,m[1].y,m[2].x,m[2].y);
line(m[2].x,m[2].y,m[3].x,m[3].y);            
line(m[3].x,m[3].y,m[4].x,m[4].y);
line(m[1].x,m[1].y,m[4].x,m[4].y);
end;
var p:mas;
    c,w,h:integer;
    r,a:real;
begin
setwindowsize(400,400);
centerwindow;
c:=200;//центр
w:=150;//длина прямоугольника
h:=80;//ширина прямоугольника
r:=sqrt(w*w+h*h);//радиус вращения вершин
a:=arctan(h/w);//острый угол на правую верхнюю вершину
//координаты и углы вершин
p[1].x:=c-w div 2;
p[1].y:=c-h div 2;
p[1].u:=pi-a;
p[2].x:=c+w div 2;
p[2].y:=c-h div 2;
p[2].u:=a;
p[3].x:=c+w div 2;
p[3].y:=c+h div 2;
p[3].u:=-a;
p[4].x:=c-w div 2;
p[4].y:=c+h div 2;
p[4].u:=pi+a;
rect(p);
lockdrawing;
repeat
clearwindow;
for var i:=1 to 4 do
 begin
  p[i].u:=p[i].u+0.1;
  p[i].x:=c+round(r*cos(p[i].u));
  p[i].y:=c+round(r*sin(p[i].u));//по часовой стрелке( - против)
 end;
rect(p); 
sleep(100);
redraw;
until false;  
 
end.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
12.08.2017, 17:04
Pascal
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
uses GraphABC;
const
  Width = 200;
  Height = 100;
 
function GetAngle(x, y, x2, y2: integer): real;
begin
  var angle := Abs(RadToDeg(ArcTan((y2 - y) / (x2 - x))));
  if (x2 = x) and (y2 = y) then Result := 0
      else
  if x2 > x then
    if y2 > y then Result := angle else Result := 270 + 90 - angle
      else
  if y2 > y then Result := 180 - angle else Result := 180 + angle;
end;
 
function Distance(x, y, x2, y2: integer):= Sqrt(Sqr(x2 - x) + Sqr(y2 - y));
 
function DCos(a: real):= Cos(DegToRad(a));
 
function DSin(a: real):= Sin(DegToRad(a));
 
procedure RLine(x, y, x1, y1: real):=Line(Round(x), Round(y), Round(x1), Round(y1));
 
begin
  LockDrawing();
  var mX := Window.Width div 2; // Центр окна по оси X.
  var mY := Window.Height div 2; // Центр окна по оси Y.
  
  var W := Width div 2; // Половина ширины прямоугольника.
  var H := Height div 2; // Половина высоты прямоугольника.
  
  var mW := mX - W;
  var mH := mY - H;
  var pW := mX + W;
  var pH := mY + H;
  
  var R := Distance(mX, mY, mW, mH); // Вычисление радиуса окружности, в которую вписан прямоугольник.
  
  var Aang := GetAngle(mX, mY, mW, mH);
  var Bang := GetAngle(mX, mY, pW, mH);
  var Cang := GetAngle(mX, mY, pW, pH);
  var Dang := GetAngle(mX, mY, mW, pH);
  
  while true do
    for var angle := 0 to 360 do
    begin
      ClearWindow();
      var Ax := mX + R * DCos(Aang + angle);
      var Ay := mY + R * DSin(Aang + angle);
      var Bx := mX + R * DCos(Bang + angle);
      var By := mY + R * DSin(Bang + angle);
      var Cx := mX + R * DCos(Cang + angle);
      var Cy := mY + R * DSin(Cang + angle);
      var Dx := mX + R * DCos(Dang + angle);
      var Dy := mY + R * DSin(Dang + angle);
      RLine(Ax, Ay, Bx, By);
      RLine(Bx, By, Cx, Cy);
      RLine(Cx, Cy, Dx, Dy);
      RLine(Dx, Dy, Ax, Ay);
      Redraw();
    end;
end.
Добавлено через 10 минут
Можно и в радианах:
Pascal
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
uses GraphABC;
const
  Width = 200;
  Height = 100;
 
function GetAngle(x, y, x2, y2: integer): real;
begin
  var angle := Abs(RadToDeg(ArcTan((y2 - y) / (x2 - x))));
  if (x2 = x) and (y2 = y) then Result := 0
      else
  if x2 > x then
    if y2 > y then Result := DegToRad(angle) else Result := DegToRad(270 + 90 - angle)
      else
  if y2 > y then Result := DegToRad(180 - angle) else Result := DegToRad(180 + angle);
end;
 
function Distance(x, y, x2, y2: integer):= Sqrt(Sqr(x2 - x) + Sqr(y2 - y));
 
procedure RLine(x, y, x1, y1: real):=Line(Round(x), Round(y), Round(x1), Round(y1));
 
begin
  LockDrawing();
  var mX := Window.Width div 2; // Центр окна по оси X.
  var mY := Window.Height div 2; // Центр окна по оси Y.
  
  var W := Width div 2; // Половина ширины прямоугольника.
  var H := Height div 2; // Половина высоты прямоугольника.
  
  var mW := mX - W;
  var mH := mY - H;
  var pW := mX + W;
  var pH := mY + H;
  
  var R := Distance(mX, mY, mW, mH); // Вычисление радиуса окружности, в которую вписан прямоугольник.
  
  var Aang := GetAngle(mX, mY, mW, mH);
  var Bang := GetAngle(mX, mY, pW, mH);
  var Cang := GetAngle(mX, mY, pW, pH);
  var Dang := GetAngle(mX, mY, mW, pH);
  
  var MaxAngle := DegToRad(360);
  var Angle:=0.0;
  
  while true do
  begin
    while Angle < MaxAngle do
    begin
      ClearWindow();
      var Ax := mX + R * Cos(Aang + angle);
      var Ay := mY + R * Sin(Aang + angle);
      var Bx := mX + R * Cos(Bang + angle);
      var By := mY + R * Sin(Bang + angle);
      var Cx := mX + R * Cos(Cang + angle);
      var Cy := mY + R * Sin(Cang + angle);
      var Dx := mX + R * Cos(Dang + angle);
      var Dy := mY + R * Sin(Dang + angle);
      RLine(Ax, Ay, Bx, By);
      RLine(Bx, By, Cx, Cy);
      RLine(Cx, Cy, Dx, Dy);
      RLine(Dx, Dy, Ax, Ay);
      Redraw();
      Angle += 0.05ж
    end;
    Angle := 0.0;
  end;
end.
Добавлено через 8 минут

Не по теме:

P. S. Вместо "ж" там ";" - ошибся при переносе кода сюда. :D

0
12.08.2017, 17:43

Не по теме:

Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Вместо "ж" там ";"
А я уж и правда подумал что ж....

0
12.08.2017, 19:35

Не по теме:

Да нет, там не ж, а увеличенное на 5% ж... А это - больше, чем ж!

0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
13.08.2017, 09:26
Цитата Сообщение от Puporev Посмотреть сообщение
А я уж и правда подумал что ж....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.08.2017, 09:26
Помогаю со студенческими работами здесь

Почему при первой попытке рисования прямоугольника его левый верхний угол начинается с точки (0, 0)?
Почему при первой попытке рисования прямоугольника его левый верхний угол начинается с точки (0, 0)? using System; using...

Как найти вектор направления тела, зная угол поворота?
Как найти вектор направления\смещения по осям тела, зная угол его поворота.

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

Как сделать, чтобы при повороте вокруг одной из осей учитывался бы угол предыдущего поворота?
Здравствуйте! Сначала я опишу ситуацию, а потом буду жаловаться на проблему:) Я пытаюсь реализовать вращение куба относительно 3х осей. У...

Угол поворота.
Привет всем! Люди помогите плиз. Как вычислить угол поворота &quot;Робота&quot; в зависимости от того куда пользователь нажал мышкой? Ну типа чтобы...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru