Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 16

Как изменить размер квадрата потянув за его ребро мышкой

26.04.2017, 00:32. Показов 1366. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем добрый день. Пишу для своего движка небольшой 3д редактор уровней (базовый функционал) на подобии Valve Hammer. Так вот, в чем проблема? Проблема в том
что у меня не получается нормально реализовать изменения размеров браша. А именно когда я рисую с верхнего левого угла в правый нижний (и не только), то вершины отзеркаливаються и перетаскиваются тогда противоположные. Как это справить? Я пытался это профиксить, но все идеи которые ко мне приходили не помогали

Вот здесь я хочу увеличить правую сторону, но оно изменяет левую (движется в сторону курсора)


Помогите решить эту проблему
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.04.2017, 00:32
Ответы с готовыми решениями:

Нарисовать прямоугольник, у которого можно изменить размер, потянув за уголок
Доброе время суток. Поставили задачу, при клике на кнопку. Должен отрисоваться прямоугольник. У которого можно изменить размер потянув...

Как изменить цвет Border и его размер
Подскажите, как изменить цвет синей строки вверху окна и ее размер.

Как изменить размер фонта у виджета и всех его детишек?
QDialog *mw = new QDialog(); mw->font().setPixelSize(16); Дает error: passing `const QFont' as `this' argument of `void...

4
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
26.04.2017, 00:38
боюсь тебя огорчить, но телепаты в отпуске, остальным потребуется код
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
26.04.2017, 09:06
zombihello, скорее всего ты работаешь с координатами, но без векторов. Так?
0
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 16
26.04.2017, 19:15  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
zombihello, скорее всего ты работаешь с координатами, но без векторов. Так?
Вроде да

Цитата Сообщение от Diamante Посмотреть сообщение
боюсь тебя огорчить, но телепаты в отпуске, остальным потребуется код
ага, вот код.

Давайте я вам покажу часть кода отвечающую за создание, инициализацию и изменение размера браша. Вот.
Вот так я создаю вершины
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
 public override void Create( Vector3f StartPosition, Vector3f EndPosition )
        {
            //AddVertex - просто в List добавляем вершину
            //AddIdVertex - просто в List добавляем id вершины чтобы знать что с чем соединять 
 
            InitBrush( StartPosition, EndPosition );
            ColorBrush = new Color( 1, 1, 1 );
            DefaultColorBrush = ColorBrush;
 
            // Front
            AddVertex( 0, 0, 0, Vertex.TypeVertex.LeftBottom ); // 0
            AddVertex( Size.X, 0, 0, Vertex.TypeVertex.RightBottom ); // 1
            AddVertex( Size.X, Size.Y, 0, Vertex.TypeVertex.RightTop ); // 2
            AddVertex( 0, Size.Y, 0, Vertex.TypeVertex.LeftTop ); // 3
 
            // Back
            AddVertex( 0, 0, Size.Z, Vertex.TypeVertex.Back_LeftBottom ); // 4
            AddVertex( Size.X, 0, Size.Z, Vertex.TypeVertex.Back_RightBottom ); // 5
            AddVertex( Size.X, Size.Y, Size.Z, Vertex.TypeVertex.Back_RightTop ); // 6
            AddVertex( 0, Size.Y, Size.Z, Vertex.TypeVertex.Back_LeftTop ); // 7
            ToGloablCoords();
 
            // Front
            AddIdVertex( 0 ); AddIdVertex( 1 ); AddIdVertex( 2 ); AddIdVertex( 3 );
            AddIdVertex( 0 ); AddIdVertex( 3 ); AddIdVertex( 1 ); AddIdVertex( 2 );
 
            // Back
            AddIdVertex( 4 ); AddIdVertex( 5 ); AddIdVertex( 6 ); AddIdVertex( 7 );
            AddIdVertex( 4 ); AddIdVertex( 7 ); AddIdVertex( 5 ); AddIdVertex( 6 );
 
            // Left
            AddIdVertex( 0 ); AddIdVertex( 4 ); AddIdVertex( 3 ); AddIdVertex( 7 );
            AddIdVertex( 0 ); AddIdVertex( 3 ); AddIdVertex( 4 ); AddIdVertex( 7 );
 
            // Right
            AddIdVertex( 1 ); AddIdVertex( 5 ); AddIdVertex( 2 ); AddIdVertex( 6 );
            AddIdVertex( 1 ); AddIdVertex( 2 ); AddIdVertex( 5 ); AddIdVertex( 6 );
 
            // Top
            AddIdVertex( 3 ); AddIdVertex( 2 ); AddIdVertex( 7 ); AddIdVertex( 6 );
            AddIdVertex( 3 ); AddIdVertex( 7 ); AddIdVertex( 2 ); AddIdVertex( 6 );
 
            // Bottom
            AddIdVertex( 0 ); AddIdVertex( 1 ); AddIdVertex( 4 ); AddIdVertex( 5 );
            AddIdVertex( 0 ); AddIdVertex( 4 ); AddIdVertex( 1 ); AddIdVertex( 5 );
        }
Вот так я инициализирую браш
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected void InitBrush( Vector3f StartPosition, Vector3f EndPosition )
        {
            if ( StartPosition.X == 0 )
                StartPosition.X = Viewport.fSize; // Viewport.fSize у меня равен 20 (это размер сетки)
 
            if ( StartPosition.Y == 0 )
                StartPosition.Y = Viewport.fSize;
 
            if ( StartPosition.Z == 0 )
                StartPosition.Z = Viewport.fSize;
 
            Position = Program.Align( StartPosition, Viewport.fSize ); // Align - метод который прикрепляет точку к сетке
 
            Size.X = Program.Align( EndPosition.X, Viewport.fSize ) - Position.X;
            Size.Y = Program.Align( EndPosition.Y, Viewport.fSize ) - Position.Y;
            Size.Z = Program.Align( EndPosition.Z, Viewport.fSize ) - Position.Z;
        }
Так я привожу к глобальным координатам браш
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        protected void ToGloablCoords()
        {
            for ( int i = 0; i < mLocalVertex.Count; i++ )
            {
                mGlobalVertex[i].X = mLocalVertex[i].Position.X + Position.X;
                mGlobalVertex[i].Y = mLocalVertex[i].Position.Y + Position.Y;
                mGlobalVertex[i].Z = mLocalVertex[i].Position.Z + Position.Z;
            }
 
            CenterBrush.X = Position.X + Size.X / 2;
            CenterBrush.Y = Position.Y + Size.Y / 2;
            CenterBrush.Z = Position.Z + Size.Z / 2;
 
            for ( int i = 0; i < mPointsResize.Count; i++ ) // обновляем белые точки для масштабирования (те что на скрине)
                mPointsResize[i].InitPoints( this, mPointsResize[i].typeViewport );
        }
А вот так я собственно изменяю размер браша
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
        public void Resize( Vector3f FactorSize, Viewport.TypeViewport typeViewport ) // TODO: Сделать изменение размеров браша
        {
            switch ( PointsResize.SelectPointType )
            {
                case PointsResize.PointType.LeftCenter: // если мы тянем за левую центральную точку
                    if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                    {
                        Size.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                    }
                    else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                              typeViewport == Viewport.TypeViewport.Side_2D_xz )
                    {
                        Size.X -= Program.Align( FactorSize.X, Viewport.fSize );
                        Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                    }
 
                    ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport );
                    break;
 
                case PointsResize.PointType.RightCenter: // если мы тянем за правую центральную точку
                    if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        Size.Z += Program.Align( FactorSize.X, Viewport.fSize );
 
                    else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                              typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        Size.X += Program.Align( FactorSize.X, Viewport.fSize );
 
 
                    ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport );
                    break;
 
                case PointsResize.PointType.RightTop:
                    break;
            }
 
 
            ToGloablCoords();
        }
А таким методом я обновляю вершины после изменения размера
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
        private void ResizeLocalVertex( Vector3f FactorSize, Viewport.TypeViewport typeViewport )
        {
            for ( int i = 0; i < mLocalVertex.Count; i++ ) // проходим по всем вершинам и смотрим какие нам надо двигать
            {
                Vertex vertex = mLocalVertex[i];
 
                switch ( PointsResize.SelectPointType ) 
                {
                    case PointsResize.PointType.LeftCenter:
                        if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                            typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.LeftTop ||
                            vertex.typeVertex == Vertex.TypeVertex.LeftBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom )
                                vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.RightBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.RightTop ||
                                vertex.typeVertex == Vertex.TypeVertex.LeftBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.LeftTop )
                                vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        break;
 
                    case PointsResize.PointType.RightCenter:
                        if ( typeViewport == Viewport.TypeViewport.Top_2D_xy ||
                            typeViewport == Viewport.TypeViewport.Side_2D_xz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.RightTop ||
                            vertex.typeVertex == Vertex.TypeVertex.RightBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_RightTop ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom )
                                vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize );
                        }
                        else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz )
                        {
                            if ( vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_RightTop ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom ||
                                vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop )
                                vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize );
                        }
 
                        break;
                }
            }
 
// если тянули за центральную левую точку, то мы перемещаем в противоположную сторону все вершины кроме левых //(ибо при изменении позиции в глоб. координатах без сего дела браш будет двигаться вслед за курсором)
 
            if ( PointsResize.SelectPointType == PointsResize.PointType.LeftCenter ) 
                for ( int i = 0; i < mLocalVertex.Count; i++ )
                {
                    Vertex vertex = mLocalVertex[i];
                    if ( vertex.typeVertex != Vertex.TypeVertex.LeftTop || vertex.typeVertex != Vertex.TypeVertex.LeftBottom )
                        if ( typeViewport != Viewport.TypeViewport.Front_2D_yz )
                            vertex.Position.X -= Program.Align( FactorSize.X, Viewport.fSize );
                        else
                            vertex.Position.Z -= Program.Align( FactorSize.X, Viewport.fSize );
                }
        }
0
0 / 0 / 0
Регистрация: 04.12.2016
Сообщений: 16
30.04.2017, 13:24  [ТС]
Все, ребята, я проблему решил. Спасибо всем кто откликнулся.
P.S: Просто надо было дописать в InitBrush несколько строчек кода

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
 protected void InitBrush( Vector3f StartPosition, Vector3f EndPosition )
        {
            if ( StartPosition.X == 0 )
                StartPosition.X = Viewport.fSize;
 
            if ( StartPosition.Y == 0 )
                StartPosition.Y = Viewport.fSize;
 
            if ( StartPosition.Z == 0 )
                StartPosition.Z = Viewport.fSize;
 
            Position = Program.Align( StartPosition, Viewport.fSize );
            EndPosition = Program.Align( EndPosition, Viewport.fSize );
 
            Size.X = EndPosition.X - Position.X;
            Size.Y = EndPosition.Y - Position.Y;
            Size.Z = EndPosition.Z - Position.Z;
 
            if ( Size.X < 0 )
            {
                Position.X = EndPosition.X;
                Size.X = Program.Align( Math.Abs( Size.X ), Viewport.fSize );
            }
 
            if ( Size.Y < 0 )
            {
                Position.Y = EndPosition.Y;
                Size.Y = Program.Align( Math.Abs( Size.Y ), Viewport.fSize );
            }
 
            if ( Size.Z < 0 )
            {
                Position.Z = EndPosition.Z;
                Size.Z = Program.Align( Math.Abs( Size.Z ), Viewport.fSize );
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.04.2017, 13:24
Помогаю со студенческими работами здесь

ScreenSaver как изменить цвет и размер эллипса во время его движения?
Здравствуйте, я новичок в c#, решил написать ScreenSaver. Не могу понять как изменить цвет эллипса на рандомный во время его ударов о край...

Как изменить размер блока на Главной, не затрагивая его параметры на других страницах?
Есть главная страница www.wordado.ru Блок с белым фоном, на котором расположилась видео-рамка, необходимо подогнать к размерам рамки. ...

Шифровать методом Магического квадрата (размер квадрата 9х9) С++
Шифровать методом Магического квадрата (размер квадрата 9х9) С++ Дана таблица 9х9. Надо реализовать программу на С++...

Как мышкой менять размер DialogBar'а?
Как мышкой менять размер DialogBar'а? Подскажите...

Как запретить frame менять размер мышкой?
Добрый день! помогите пожалуйста! найти как запретить frame менять размер мышкой &lt;a href=&quot;javascript://&quot;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Настройка записи справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru