Перейти к содержанию
pachela

[C#] Стрелка направления к нужной точке

Рекомендуемые сообщения

Задумал интересную задачку, пока сам не смог реализовать, так как не сильно понимаю как взять координаты для построения линии.

Ну да все по порядку.

Есть 2 координаты: Моя текущая (FactX, FactY) и конечная точка (endX, EndY)

Нужно в C# в небольшом окошке нарисовать стрелку (как на компасе) указывающую с центра и в направлении конечной точки.

будем использовать System.Drawing

Далее код который у меня есть, но который не работает и он вообще не доведен до ума.

Спойлер

 

 

Проблема возникает на моменте вычисления координат. За пример брал аналоговые часы. Но это не совсем корректно.

Так же есть интересный код, который мы тут ранее обсуждали (старая тема)

Приведу сюда вычисление угла
 

Спойлер

 

 

Но пока то, что имею не могу применить. Дайте напутствие форумчане!

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Опубликовано (изменено)

напутствие 

Спойлеры пустые. Или это у меня что-то с хромом

Изменено пользователем JIeXA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно. Вчера все хорошо отображалось... Вот, что значит сонный.

Приду с работы и отредактирую.

Но все равно выслушаю любые ваши предложения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слишком мало входных данных. Ты хочешь сделать радар или просто в игре провести линию от центра экрана к какой-то точке? И да, кода нет под спойлером.

Если хочешь сделать радар, то

 

Принцип создания простого 2D радара в 3D игре

  • Получить 3D координаты актёра
  • Получить 3D координаты точки / сущности
  • Перевести координаты актёра из 3D в 2D
  • Перевести координаты точки / сущности из 3D в 2D
  • Нарисовать точку (любую геометрическую фигуру) положение актера
  • Нарисовать точку (любую геометрическую фигуру) положение точки / сущности
  • Вычислить положение актера относительно точки / сущности
  • Провести линию (в твоём случае)
  • Обновить

Но, как я понял у тебя уже 2D координаты или 2D игра. А если хочешь в игре провести линию, то просто используй вместо холста радара, холст игры. Так что тебе меньше работы предстоит выполнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3d координаты и актера и точки есть. Я просто не вижу смысла использовать Z координаты.

Положение актера у нас будет всегда в центре компаса.

Как перенести игровые координаты точки в координаты на плоскости радара, я не знаю. В этом и вопрос.

Компас должен быть в отдельном от игры окне, что бы использовать на 2 мониторе, да и это будет часть уже готовой программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я просто оставлю ЭТО здесь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 часов назад, pachela сказал:

3d координаты и актера и точки есть. Я просто не вижу смысла использовать Z координаты.

Положение актера у нас будет всегда в центре компаса.

Как перенести игровые координаты точки в координаты на плоскости радара, я не знаю. В этом и вопрос.

Компас должен быть в отдельном от игры окне, что бы использовать на 2 мониторе, да и это будет часть уже готовой программы.

 

Получи координаты центра твоего второго окна путём деления ширины и высоты на 2. К примеру для Windows Form .NET C#:

System.Int32 CenterX = this.Width / 2;
System.Int32 CenterY = this.Height / 2;
//Где "this" - указатель на текущий экземляр класса, описывающий твою форму
//System.Int32 - структура описывающая тип данных integer

Найди свои координаты, потом найди расстояния от своих до координат другого объекта путём вычитания значений каждой оси и эту разность прибавляй к переменным CenterX, CenterY, таким образом центр радара - это "ты" грубо говоря.

System.Int32 PosX = CenterX + Convert.ToInt32(/*разность координат по оси X*/);
System.Int32 PosY = CenterY + Convert.ToInt32(/*разность координат по оси Y*/);
//Convert.ToInt32 - потому что на Windows Form позиция X, Y является целым числом особенно если использовать структуру Point
//Далее можно спользовать PosX и PosY для рисования объекта на "радаре"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так как спойлеры первого сообщения пустые и то сообщение я не могу редактировать, то пусть все будет новым сообщением

Вот код формы радара, не рабочий, пока просто болванка.

Спойлер

public partial class Form3 : Form
    {
        Timer t = new Timer();
        int WIDTH = 200, HEIGHT = 200;
        
        float cx, cy; //center
        Bitmap bmp;
        Graphics g;
        
        public Form3()
        {
            InitializeComponent();
        }        

        private void Form3_Load(object sender, EventArgs e)
        {
            bmp = new Bitmap(WIDTH + 1, HEIGHT + 1);
            //center
            cx = WIDTH / 2;
            cy = HEIGHT / 2;
          
            this.BackColor = Color.Black;

            //timer
            t.Interval = 1000;
            t.Tick += new EventHandler(this.t_Tick);
            t.Start();
        }

        private void t_Tick(object sender, EventArgs e)
        {
            g = Graphics.FromImage(bmp);
            
            float XX = (float)Form1.Xdiff; //под следующим спойлером
            float YY = (float)Form1.Ydiff; //под следующим спойлером
          
            PointF point1 = new PointF(cx, cy);
            PointF point2 = new PointF(XX, YY);            

            g.Clear(Color.White); //еще не вникал, что это делает

            //рисуем круг
            g.DrawEllipse(new Pen(Color.Green, 1f), 0, 0, WIDTH, HEIGHT);

            //Рисуем стрелку 
            Pen blackPen = new Pen(Color.Green, 2);

            g.DrawLine(blackPen, point1, point2);

            g.Dispose();
        }
    }

 

А теперь вот код с вычислением угла, который прекрасно работает уже много времени

Спойлер

private void CalcAngle2() //Калькуляция угла поворота
        {
            while (stopThreadeFlag != 0)
            {
                nX = EndXX; //Координаты точки
                nY = EndYY; //Координаты точки
                X = XXmem; //Текущие координаты игрока
                Y = YYmem; //Текущие координаты игрока
                //Section 1
                if (nY > Y && nX <= X)
                {
                    Ydiff = nY - Y;
                    Xdiff = X - nX;
                    // Умножаем на 57.29578 для перевода из радиан в градусы.
                    AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578;
                    tmp = 180 - AngleA;

                }
                // Section 2 
                if (nY <= Y && nX < X)
                {
                    Ydiff = Y - nY;
                    Xdiff = X - nX;

                    AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578;

                    tmp = 0 + AngleA;
                }
                // Section 3
                if (nY < Y && nX >= X)
                {
                    Ydiff = Y - nY;
                    Xdiff = nX - X;

                    AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578;


                    tmp = 360 - AngleA;
                }
                // Section 4
                if (nY >= Y && nX > X)
                {
                    Ydiff = nY - Y;
                    Xdiff = nX - X;

                    AngleA = Math.Atan(Xdiff / Ydiff) * 57.29578;

                    tmp = 180 + AngleA;
                }
                tmp = tmp / 57.29578; //переводим с градусов в радианы
            }            
        }

 

Вот мы тут вроде бы и разность между точками находим и угол направления. Но теперь как мне нарисовать точку в нужной стороне радара? Как радар поймет с какой стороны у него находятся координаты Xdiff, Ydiff?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
40 минут назад, pachela сказал:

Вот код формы радара, не рабочий, пока просто болванка.

Зачем ты продолжаешь мусолить тему, если я тебе скинул готовое решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
22 минуты назад, JustHack сказал:

Зачем ты продолжаешь мусолить тему, если я тебе скинул готовое решение?

Потому что:

1. Я не являюсь профи в программировании и не могу идеально читать код. Многие моменты мне не понятны!

2. Я хочу разобраться и понять саму суть, что бы в будущем, если понадобиться, понимать что делаю, а не снова искать готовый код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем так, логику создания радара тебе написали. Код реализации дали. Учить основам программирования на C# и базового курса математики, тебя никто не будет. Не хочешь разбираться -> просто воткни этот модуль к себе в проект. Хочешь разобраться -> бери код, бери описание логики, читай код / переделывай под себя / бери какую-то часть, разбирайся и вникай. На поставленный вопрос тебе ответили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
33 минуты назад, JustHack сказал:

В общем так, логику создания радара тебе написали. Код реализации дали. Учить основам программирования на C# и базового курса математики, тебя никто не будет. Не хочешь разбираться -> просто воткни этот модуль к себе в проект. Хочешь разобраться -> бери код, бери описание логики, читай код / переделывай под себя / бери какую-то часть, разбирайся и вникай. На поставленный вопрос тебе ответили.

Жаль тут нет эмодзи поклона в пол.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.