0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 5
.NET 4.x

Осуществить вращение фигуры(квадрата) вокруг своей оси

12.11.2018, 03:10. Показов 6192. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте, пытаюсь написать алгоритм, который при зажимании мыши вращает квадрат вокруг своей оси. Почему то после полного вращения квадрат растягивается в прямоугольник, а затем обратно. В чём проблема?


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
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;
 
namespace program
{
    public partial class Form1 : Form
    {
        PointF[] sqr = { new PointF(300, 300), new PointF(400, 300), new PointF(400, 400), new PointF(300, 400) };
        PointF[] sqr2 ={ new PointF(300, 300), new PointF(400, 300), new PointF(400, 400), new PointF(300, 400) };
        public Form1()
        {
            InitializeComponent();
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        { 
            e.Graphics.DrawPolygon(new Pen(Color.Black,1),sqr);
        }
        double t = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            int xfix = 350, yfix = 350; //точка вращения
 
            int xt = (int)sqr[0].X, yt = (int)sqr[0].Y;
            sqr2[0].X = sqr[0].X;
            sqr2[0].Y = sqr[0].Y;
            sqr[0].X =(float)((sqr[0].X - xfix) * Math.Cos(t) - (sqr[0].Y - yfix) * Math.Sin(t) + xfix);
            sqr[0].Y = (float)((sqr[0].X - xfix) * Math.Sin(t) + (sqr[0].Y - yfix) * Math.Cos(t) + yfix);
            sqr2[1].X = sqr[1].X;
            sqr2[1].Y = sqr[1].Y;
            sqr[1].X = sqr[1].X + sqr2[0].X - sqr[0].X;
            sqr[1].Y = sqr[1].Y + sqr2[0].Y - sqr[0].Y;
            sqr[2].X = sqr[1].X;
            sqr[2].Y = sqr[1].Y - 100;
            sqr[3].X = sqr[0].X;
            sqr[3].Y = sqr[0].Y - 100;
            panel1.Invalidate();
 
        }
 
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            timer1.Start();
        }
 
        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            timer1.Stop();
        }
 
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            t +=0.0001;
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2018, 03:10
Ответы с готовыми решениями:

Вращение колеса вокруг своей оси
Помогите. Я уже запарилась. В общем, мне нужно что бы колесо со спицами двигалось по осе X и вращалось ВОКРУГ СВОЕЙ ОСИ и никуда не...

Вращение фигуры вокруг произвольной оси
Приветствую! Подскажите формулу для вращения. К примеру есть квадрат или любой другой объект, который нужно повернуть вокруг своей оси...

Вращение фигуры вокруг центра оси
Имеется след. класс фигуры: class Model { /// <summary> /// Массив рёбер /// </summary> ...

1
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
12.11.2018, 07:53
Лучший ответ Сообщение было отмечено WonderIT как решение

Решение

WonderIT,
Создадим два вспомогательных метода:
1. Метод для получения центра фигуры:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// Получение центра охватывающего прямоугольника
/// </summary>
/// <param name="vector">массив точек фигуры</param>
/// <returns>прямоугольник</returns>
public PointF GetCenter(PointF[] vector)
{
    using (var gp = new GraphicsPath())
    {
        gp.AddPolygon(vector);
        var rect = gp.GetBounds();
        return PointF.Add(rect.Location, 
            new SizeF(rect.Width / 2, rect.Height / 2));
    }
}
И метод для поворота фигуры из точек:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Поворот вокруг точки
/// </summary>
/// <param name="vector">массив точек фигуры</param>
/// <param name="angle">угол поворота (в градусах)</param>
/// <param name="cx">центр X</param>
/// <param name="cy">центр Y</param>
public void RotateAt(PointF[] vector, float angle, float cx, float cy)
{
    using (var gp = new GraphicsPath())
    {
        gp.AddPolygon(vector);
        using (var m = new Matrix())
        {
            m.RotateAt(angle, new PointF(cx, cy));
            gp.Transform(m);
        }
        var ps = gp.PathPoints;
        for (var i = 0; i < ps.Length; i++)
            vector[i] = ps[i];
    }
}
Применяем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PointF[] sqr = { new PointF(300, 300), new PointF(400, 300), new PointF(400, 400), new PointF(300, 400) };
 
private PointF _centerSqr;
 
public Form1()
{
    InitializeComponent();
    _centerSqr = GetCenter(sqr);
}
 
private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawPolygon(new Pen(Color.Black, 1), sqr);
}
 
private void timer1_Tick(object sender, EventArgs e)
{
    RotateAt(sqr, 5, _centerSqr.X, _centerSqr.Y);
    Invalidate();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2018, 07:53
Помогаю со студенческими работами здесь

Вращение букв вокруг оси
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Вращение фигуры вокруг точки
Есть точка и есть набор фигур, расположенных вокруг этой точки. Как вращать эти фигуры против часовой стрелки вокруг этой точки? ...

Как заставить крутиться по часовой стрелке вокруг своей оси картинку?
Есть пикчер бокс с картинкой, как заставить крутиться по часовой стрелке вокруг своей оси картинку ?

Вращение одной сферы вокруг другой
Здравствуйте, тему для курсовой выбрал &quot;моделирование атома&quot;. Пользоваться библиотеками нельзя, только попиксельно вырисовывать. ...

Вращение фигуры вокруг своей оси за курсором мыши
Всем доброго времени суток. Уже несколько недель бьюсь над данной задачей: как реализовать вращение фигуры за курсором мыши. Пробовал...


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

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

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru