Как рассчитать координаты по наклону?

Рейтинг: -1Ответов: 2Опубликовано: 03.05.2023

У меня есть координаты точки игрока (50, 100) Идет отклонение на 10 градусов оп часовой стрелке рисунок того как это выглядит

мне нужно посчитать координаты x и y конечной точки луча при этом угол наклона, координаты игрока могут менятся и надо придумать как это сделать Я програмирую на pygame введите сюда описание изображения

полная версия: https://drive.google.com/file/d/1DFqnKnUzWxpLXdziHSZemKaGL7aHTIFp/view?usp=share_link минимальная версия: Main.py:

import pygame
import render
def run():

        pygame.init()
        screen = pygame.display.set_mode(500, 500)
        pygame.display.set_caption('3d game')
        while True:
            def run():
        pygame.init()
        screen = pygame.display.set_mode((screen_size['width'],screen_size['height']))
        pygame.display.set_caption('3d game')
        while True:
            pygame.draw.rect(screen, (255, 255, 255), pygame.Rect(0, 0, 500, 500))
            render.render_position(screen)
            pygame.display.flip()
    run()

render.py:

import camera
import pygame

renderCamera = camera.Camera(100, 350)
def render_position(screen):
    pygame.draw.circle(screen, (0, 0, 255), (250, 250), 30)
    #for angle in range(0, 350, 10):
#        pygame.draw.line(screen, (255, 70, 70), (renderCamera.x, #renderCamera.y), !тут проблема!)

camera.py:

class Camera:
    def __init__(self, x, y):
        self.x = x
        self.y = y

Ответы

▲ 1Принят

возможно ответ выше был непонятен...

import pygame
import math

def get_pos(start_pos, distance, angle):
    rad = angle / 180 * math.pi
    return (\
     start_pos[0] + math.cos(rad) * distance,\
     start_pos[1] + math.sin(rad) * distance )

start_pos это (число, число) (кортёж или список двух чисел)
distance это число
angle это число

внутри функции градусы переводятся в радианы т.к. это sin cos принимают в аргумент - угол в радианах)

а также из за перевёрнутой по y системы координат угол надо брать отрицательный

и кстати точка с нулевым углом находится справа

(при необходимости можно вычесть из rad - math. pi / 2)

не совсем понятен вопрос, в том плане какая именно точка нужна, так например в ответе чуть ранее взяли точку пересечения с границей о которой вроде не говорится в вопросе, я же взял точку на круге с радиусом distance

▲ 1

Пусть начало луча start, угол наклона Fi, размеры экрана width, height

введите сюда описание изображения

Единичный вектор направления

dx = Cos(Fi)
dy = Sin(Fi)

Параметрическое уравнение луча для справки (в коде не нужно):

//x = start.x + dx * t
//y = start.y + dy * t

Границы, в которые может упереться луч

if dx > 0 then
   bx = width
else
   bx = 0

if dy > 0 then
   by = height
else
   by = 0

Проверка на вертикаль или горизонталь

if dx == 0 then
    return ix = start.x,  iy = by

if dy == 0 then
    return iy = start.y,  ix = bx

В общем случае найдём параметры параметрического уравнения

tx = (bx - start.x) / dx
ty = (by - start.y) / dy

И возьмем точку пересечения с меньшим значением параметра

if tx <= ty then
    ix = bx
    iy = start.y + tx * dy
 else
    iy = by
    ix = start.x + ty * dx

 return ix, iy  //вот она, точка пересечения с границей