pachela Опубликовано 18 ноября, 2020 Поделиться Опубликовано 18 ноября, 2020 Задумал интересную задачку, пока сам не смог реализовать, так как не сильно понимаю как взять координаты для построения линии. Ну да все по порядку. Есть 2 координаты: Моя текущая (FactX, FactY) и конечная точка (endX, EndY) Нужно в C# в небольшом окошке нарисовать стрелку (как на компасе) указывающую с центра и в направлении конечной точки. будем использовать System.Drawing Далее код который у меня есть, но который не работает и он вообще не доведен до ума. Спойлер Проблема возникает на моменте вычисления координат. За пример брал аналоговые часы. Но это не совсем корректно. Так же есть интересный код, который мы тут ранее обсуждали (старая тема) Приведу сюда вычисление угла Спойлер Но пока то, что имею не могу применить. Дайте напутствие форумчане! Заранее спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
JIeXA Опубликовано 18 ноября, 2020 Поделиться Опубликовано 18 ноября, 2020 (изменено) напутствие Спойлеры пустые. Или это у меня что-то с хромом Изменено 18 ноября, 2020 пользователем JIeXA Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 19 ноября, 2020 Автор Поделиться Опубликовано 19 ноября, 2020 Странно. Вчера все хорошо отображалось... Вот, что значит сонный. Приду с работы и отредактирую. Но все равно выслушаю любые ваши предложения. Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 19 ноября, 2020 Поделиться Опубликовано 19 ноября, 2020 Слишком мало входных данных. Ты хочешь сделать радар или просто в игре провести линию от центра экрана к какой-то точке? И да, кода нет под спойлером. Если хочешь сделать радар, то Принцип создания простого 2D радара в 3D игре Получить 3D координаты актёра Получить 3D координаты точки / сущности Перевести координаты актёра из 3D в 2D Перевести координаты точки / сущности из 3D в 2D Нарисовать точку (любую геометрическую фигуру) положение актера Нарисовать точку (любую геометрическую фигуру) положение точки / сущности Вычислить положение актера относительно точки / сущности Провести линию (в твоём случае) Обновить Но, как я понял у тебя уже 2D координаты или 2D игра. А если хочешь в игре провести линию, то просто используй вместо холста радара, холст игры. Так что тебе меньше работы предстоит выполнить. Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 19 ноября, 2020 Автор Поделиться Опубликовано 19 ноября, 2020 3d координаты и актера и точки есть. Я просто не вижу смысла использовать Z координаты. Положение актера у нас будет всегда в центре компаса. Как перенести игровые координаты точки в координаты на плоскости радара, я не знаю. В этом и вопрос. Компас должен быть в отдельном от игры окне, что бы использовать на 2 мониторе, да и это будет часть уже готовой программы. Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 19 ноября, 2020 Поделиться Опубликовано 19 ноября, 2020 Я просто оставлю ЭТО здесь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergey99 Опубликовано 19 ноября, 2020 Поделиться Опубликовано 19 ноября, 2020 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 для рисования объекта на "радаре" Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 19 ноября, 2020 Автор Поделиться Опубликовано 19 ноября, 2020 Так как спойлеры первого сообщения пустые и то сообщение я не могу редактировать, то пусть все будет новым сообщением Вот код формы радара, не рабочий, пока просто болванка. Спойлер 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? Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 19 ноября, 2020 Поделиться Опубликовано 19 ноября, 2020 40 минут назад, pachela сказал: Вот код формы радара, не рабочий, пока просто болванка. Зачем ты продолжаешь мусолить тему, если я тебе скинул готовое решение? Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 19 ноября, 2020 Автор Поделиться Опубликовано 19 ноября, 2020 22 минуты назад, JustHack сказал: Зачем ты продолжаешь мусолить тему, если я тебе скинул готовое решение? Потому что: 1. Я не являюсь профи в программировании и не могу идеально читать код. Многие моменты мне не понятны! 2. Я хочу разобраться и понять саму суть, что бы в будущем, если понадобиться, понимать что делаю, а не снова искать готовый код. Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 20 ноября, 2020 Поделиться Опубликовано 20 ноября, 2020 В общем так, логику создания радара тебе написали. Код реализации дали. Учить основам программирования на C# и базового курса математики, тебя никто не будет. Не хочешь разбираться -> просто воткни этот модуль к себе в проект. Хочешь разобраться -> бери код, бери описание логики, читай код / переделывай под себя / бери какую-то часть, разбирайся и вникай. На поставленный вопрос тебе ответили. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
pachela Опубликовано 20 ноября, 2020 Автор Поделиться Опубликовано 20 ноября, 2020 33 минуты назад, JustHack сказал: В общем так, логику создания радара тебе написали. Код реализации дали. Учить основам программирования на C# и базового курса математики, тебя никто не будет. Не хочешь разбираться -> просто воткни этот модуль к себе в проект. Хочешь разобраться -> бери код, бери описание логики, читай код / переделывай под себя / бери какую-то часть, разбирайся и вникай. На поставленный вопрос тебе ответили. Жаль тут нет эмодзи поклона в пол. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения