Раздел:
Триггеры и объекты

Что это?

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

Оглавление

Разработка

Статья находится в разработке, так что вам выпала уникальная возможность лайкать и комментировать задавать вопросы, которые будут впоследствии освещены в статье. На данный момент, список пожеланий выглядит так:
  • Двигать по прямой, (нахождение угла между точками (два способа через координаты и через atan2))
  • Движение к цели (каждый раз находить угол)
  • Движение по кругу
  • Движение по параболе (для прыжков)
  • Что делать если нужно не искать точку внутри фигуры а пересечение с кругами заданного радиуса, квадратами и многоугольниками

Полезные ссылки

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
29
9 месяцев назад
0
Парабола не только дуга по z
Парабола это какраз дуга по z. И туда можно любую функцию засунуть, хоть того же Безье.
Думаю, что безье можно наделать в кучу точек. Но должен быть какой то шаблон точек? Или как?
При движении количество точек зависит только от скорости снаряда и периода таймера.
Я вот пример квадратичную безье использую, то дуга получается не такой широкой.
Самая популярная. Только вот кривым Безье вообще неважно, сколько точек.
Так мне кажется, что чем больше точек, тем точнее кривая
Ну так логично, чем ближе точки друг к другу, тем плавнее кажется движение.
1
27
9 месяцев назад
1
nazarpunk, вот еще один пример. Относительные повороты
Это полезно. Как поворачивать несколько снарядов относительно чего то. Или строить чего. Была у меня тема создать симметричную точку относительно прямой. В данных есть коорды точки, и уравнение прямой ax+by²+c=0. И там не уверен, что правильно решил в вычислительноц геометрии. Я попробовал, дебажить, она неверно работает.
1
29
9 месяцев назад
Отредактирован nazarpunk
1
вот еще один пример. Относительные повороты
Я эту методу использую в своих прямоугольниках, чтоб развернуть их паралельно осям.
0
29
9 месяцев назад
Отредактирован nazarpunk
0
Была у меня тема создать симметричную точку относительно прямой.
У прямой есть угол AB. Нужно сначала найти кратчайшее расстояние от точки до прямой, в нашем случае это B. Потом просто повернуть точку на 𝜋 относительно B.
Загруженные файлы
0
37
9 месяцев назад
0
У float ноль - это бесконечно малое. На бесконечно малое делить можно. Получаются +/-INF. Арифметика рациональных чисел никуда не делась

См пункт 3.1 habr.com/ru/articles/112953
0
18
9 месяцев назад
0
нигде не видел, почему в Atan2 передают разницу координат
  local real dx = GetUnitX(tu) - GetUnitX(u)
  local real dy = GetUnitY(tu) - GetUnitY(u)
  local real angle = Atan2(dy, dx)
0
29
9 месяцев назад
Отредактирован nazarpunk
0
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол получится, tu->u или u->tu?
0
18
9 месяцев назад
0
Vlod, ключевое слово почему. Вот ты сейчас на глаз быстро скажешь, какой угол болучится, tu->u или u->tu?
Протестировать 2 минуты, в целом можно обернуть в функцию, но без интерфейсов и женериков остается сухой матан
0
29
9 месяцев назад
0
Протестировать 2 минуты
Отличный план, Волтер. И как на основании этого более сложные вычисления делать? Тестировать 20 минут, 200, 2000?
0
27
9 месяцев назад
Отредактирован MpW
0
Была у меня тема создать симметричную точку относительно прямой.
У прямой есть угол AB. Нужно сначала найти кратчайшее расстояние от точки до прямой, в нашем случае это B. Потом просто повернуть точку на 𝜋 относительно B.
Ну, я понимаю как это сделать.. однако, это бывает на функцию с коордами много вычислении приходит. Плюс, исходные данные задачи были другие у меня
  • прямая e выражена коэ-тами a,b,c
  • точка px,py
Найти симметричную x,y от px,py
Ясно что относительно точки p строится перпендикуляр от прямой e. И потом поворот. Ну, у нас коэ-ты. Я короче, не знал как проверить правильно ли вышло. Я где-то надыбил формулы перехода a,b,c => точку, углы, и проверял вроде работает. А правильно, это уже неизвестна. Не всегда можно проверить. Формально сделал несколько проверок, и работает. На деле, я попробовал тест сделвть относительно горизонтальной e (коэ-ты некоторые обнулил),
Пусть в общем уравнении прямой один из коэффициентов A или B – нулевой, а C ≠ 0, т.е. уравнение прямой имеет вид
Ax+C = 0 или By+C = 0.
Эти уравнения можно записать в виде
x = a и y = b .
Таким образом, прямая в уравнении которой отсутствует одна из координат, параллельна оси отсутствующей координаты
Почему я брал горизонтальные или вертикальные прямые? Легче проверять симметричные точки. Когда прямая под углом, сложно проверить
Ну и вывод: и все пошло по одному месту.. там и деление на ноль, и кучу неточностей. Формулы нуждаются в переделках. Проверки пришллсь добавить. Все получилось. А и в координатах знаки перевернуты.. мне показалось, что что то не так и забросил

исходный код
Без всяких правок, какой есть
  1. относительно прямой e ищем перпендикуляр pe, тут коэф-ты a,b местами меняем, не трогая c
  2. ищем точку пересечения x0,y0 прямых e и pe (не допустить деления на ноль). Она и будет точкой перпендикуляра
  3. потом симметричная (тут я даже не понял, что я делаю. Кажется понял, помните когда ищем середину отрезка x0=(x1+x2)/2, y0=(y1+y2)/2. Только теперь, надо найти x1,y1 или x2,y2
--вектор нормали (перпендикулярный)
function NormalVectorLine(a,b,c)
	return a,b
end

function PerpendicularLine(x1,y1,a,b,c)

	--снимаем вектор нормали из ax+by+c=0
	local x2,y2=NormalVectorLine(a,b,c)
	
	--уравнение составим по точке x1,y1 и направляющему вектору x2,y2
	
	--уравнение перпендикулярной линии ax1+by1+c1=0 
	local a1,b1,c1 = (y2-y1),(x1-x2),a*(y2-y1)+b*(x2-x1)
	
    --проверка, что линия перпендикулярна
	local p = a1*(x2-x1) + b1*(y2-y1)
	if p==0 then 
	    print("перпедикулярны "..p)
	else
	    print("не перпедикулярны "..p)
	end
	
	return a1,b1,c1
end
function LinesIntersect(a1,b1,c1, a2,b2,c2)
	local x = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
	local y = (a2 * c1 - a1 * c2) / (a1 * b2 - a2 * b1);
	return x,y
end
function PointOnLine(x,y,x1,y1,x2,y2)
	return(x - x1) * (y2 - y1) - (y - y1) * (x2 - x1)==0
end
function SymmetricalPointAboutLine(x,y,a,b,c)
	--Находим прямую line 2, которая перпендикулярна текущей прямой line 1.
	local a1,b1,c1=PerpendicularLine(x,y,a,b,c)
	--точка пересечения прямых
	local x0,y0=LinesIntersect(a1,b1,c1, a,b,c)
	--теперь находим симметричную точку, как известно x0,y0 - середина точки
	local px,py=2*x0-x,2*y0-y
	
	if PointOnLine(px,py,x0,y0,x,y) then
		print('симметричная точка px,py принадлежит прямой line 2')
	else
		print('симметричная точка px,py не принадлежит прямой line 2')
	end
	--проверяем одинаковы ли отрезки
	if ((x-x0)^2+(y-y0)^2)^0.5 == ((px-x0)^2+(py-y0)^2)^0.5 then
		print('длины отрезков одинаковы, координаты px,py верны')
	else
		print('длины отрезков не равны, координаты px,py не верны')
	end
	return px,py
end
print(SymmetricalPointAboutLine(-1,1,3,4,-12))
0
29
9 месяцев назад
0
прямая e выражена коэ-тами a,b,c
Передать их в функцию и получить две рандомные точки на прямой. Ну а дальше по накатанной.

Да и как ты писал выше - нужно решать прикладную задачу. Какую именно задачу ты решал с помошью ax + bx + c = 0?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.