Приятно видеть попытки разобраться в линейной алгебре на плоскости, это поможет не только в разработке игр, но и при создании разметки изображений.
А теперь расскажу о простом для понимания, но несколько дорогом для cpu (задействуется извлечение корня) алгоритме о пересечении отрезков. Поехали.
Первым делом зададим точки A, B, C, D на двумерной плоскости, А и В задают первый отрезок, C и D - второй.
Основная идея - привести систему к вырожденному случаю, когда точка А' имеет координаты (0, 0), а точка В' лежит на оси ОХ.
Первым делом вычтем из точек В, С и D точку А, так мы достигнем первого условия. Теперь нужно повернуть точки С и D вокруг точки А (точку В поворачивать не нужно, её координаты будут (length(A, B), 0)). Для этого воспользуемся матрицей поворота, для неё нужны синус и косинус угла линии AB, благо их легко вычислить, зная длину AB и расстояние по оси ОХ и ОY между точками А и В.
После умножения точек С и D на матрицу поворота мы получим С' и D' в локальных координатах отрезка АВ.
Задача о пересечении становится тривиальной:
Точки С' и D' с разных сторон оси ОХ, или одна из точек близка к отрезку А'В' на некоторую эпсилон.
Теперь когда точки С' и D' с разных сторон оси ОХ мы можем найти точку пересечения С'D' и ОХ:
Найдем расстояние по ОХ между С' и D' (cdLy)
Найдём параметр alpha, поделив координату Y точки С' на расстояние по OY точек С' и D'.
Найдём координату X точки М' (пересечение), помножив cdLy на alpha. Координата X должна оказаться больше или равна 0 и меньше или равна длине АВ, в противном случае отрезки не пересекаются.
Вернём точку М' в мировое пространство, помножив её на инверсную матрицу поворота (в данном случае нужно всего лишь поменять знаки). По факту здесь можно умножить кординату X точки М' на синус и косинус угла линии АВ.
После этого к точке М нужно прибавить координаты точки А.
Весьма долгий путь, зато общий. Так можно найти расстояние от отрезка до точки (а заодно самую ближайшую точку на отрезке к заданной точке), то же можно провернуть с лучом или линией, приведя их к форме отрезка и убрав проверки на ось ОY и/или длину АВ.
Подобный подход можно использовать для пересечения отрезка и треугольника в трёхмерном пространстве. В таком случае пусть треугольник будет АВС, а отрезок DE. Аналогично нужно из точек B, C, D и Е отнять точку А и помножить на матрицу треугольника АВС (тангент - сторона АВ, нормаль - векторное произведение АВ и АС, битангент - тангент х нормаль, получится матрица TBN. Все вектора T, B, N нужно нормализовать). После этого задача опять тривиальна: точка А' лежит в начале координат, точка В' на оси ОХ, а точка С' выше оси ОХ. Найти точку пересечения в этом случае тривиально, описывать не стану.
IMHO, автоматическую генерацию коммитов можно реализовать через поиск убранных "//TODO:" и "//fixme:" и добавленных. Это можно было бы объединить с багтрекером, или issue.
Только до тех пор, пока вместо списка не окажется numpy array, который в случае a = np.asarray([1,2,3]) * 3 выдаст [3, 6, 9].
В этом и минус питона при обучении - скрытость типов данных. На мой взгляд, лучше начинать с С++, Java, любого другого языка, где типы данных указываются явно и нет перегрузки операторов "из коробки".
Такую простую 2д анимацию в питоне лучше сделать через pygame. Если нужно что-то мощнее - DirectX/OpenGL. Второй вариант подойдёт, если ученик интерисуется 3д графикой.
Вы можете использовать JNI, чтобы использовать хвостовую рекурсию и ФП, которое есть в С++. Странен хейт в сторону явы, когда есть JNI, позволяющий писать часть проекта на компилируемом языке, например С++.
Документация функций нужна практически во всех случаях, когда код разбивается на несколько файлов, и время его разработки превышает неделю.
Документация функций и классов позволяет вернуться к старому проекту за несколько часов. Указание параметов, исключений, связанных классов ускоряет понимание роли функции в проекте.
Комментарии в самом коде я оставлю на усмотрение разработчика. Они могут быть нужны в случае for(int i = 0; i < arr.length;), где возникает вопрос, почему значение i не обновляется. Константы в коде тоже должны содержать комментарии, например значения по умолчанию и/или описание поведения при их изменении.
Таково моё субъективное мнение про комментирование, интересно узнать ваше.
Я пробовал GeoGebra. В браузере она тормозит, некорректно парсит формулы, например ||x|-1| (\left|\left|x\right|-2\right|), не везде работает Ctrl+Z. Поэтому я выбрал Desmos. Единственное чем GeoGebra лучше Desmos'a лично для меня — возможностью строить трёхмерные уравнения.
Кому любопытно,
Это
Код Грея
Приятно видеть попытки разобраться в линейной алгебре на плоскости, это поможет не только в разработке игр, но и при создании разметки изображений.
А теперь расскажу о простом для понимания, но несколько дорогом для cpu (задействуется извлечение корня) алгоритме о пересечении отрезков. Поехали.
Первым делом зададим точки A, B, C, D на двумерной плоскости, А и В задают первый отрезок, C и D - второй.
Основная идея - привести систему к вырожденному случаю, когда точка А' имеет координаты (0, 0), а точка В' лежит на оси ОХ.
Первым делом вычтем из точек В, С и D точку А, так мы достигнем первого условия. Теперь нужно повернуть точки С и D вокруг точки А (точку В поворачивать не нужно, её координаты будут (length(A, B), 0)). Для этого воспользуемся матрицей поворота, для неё нужны синус и косинус угла линии AB, благо их легко вычислить, зная длину AB и расстояние по оси ОХ и ОY между точками А и В.
После умножения точек С и D на матрицу поворота мы получим С' и D' в локальных координатах отрезка АВ.
Задача о пересечении становится тривиальной:
Точки С' и D' с разных сторон оси ОХ, или одна из точек близка к отрезку А'В' на некоторую эпсилон.
Теперь когда точки С' и D' с разных сторон оси ОХ мы можем найти точку пересечения С'D' и ОХ:
Найдем расстояние по ОХ между С' и D' (cdLy)
Найдём параметр alpha, поделив координату Y точки С' на расстояние по OY точек С' и D'.
Найдём координату X точки М' (пересечение), помножив cdLy на alpha. Координата X должна оказаться больше или равна 0 и меньше или равна длине АВ, в противном случае отрезки не пересекаются.
Вернём точку М' в мировое пространство, помножив её на инверсную матрицу поворота (в данном случае нужно всего лишь поменять знаки). По факту здесь можно умножить кординату X точки М' на синус и косинус угла линии АВ.
После этого к точке М нужно прибавить координаты точки А.
Весьма долгий путь, зато общий. Так можно найти расстояние от отрезка до точки (а заодно самую ближайшую точку на отрезке к заданной точке), то же можно провернуть с лучом или линией, приведя их к форме отрезка и убрав проверки на ось ОY и/или длину АВ.
Подобный подход можно использовать для пересечения отрезка и треугольника в трёхмерном пространстве. В таком случае пусть треугольник будет АВС, а отрезок DE. Аналогично нужно из точек B, C, D и Е отнять точку А и помножить на матрицу треугольника АВС (тангент - сторона АВ, нормаль - векторное произведение АВ и АС, битангент - тангент х нормаль, получится матрица TBN. Все вектора T, B, N нужно нормализовать). После этого задача опять тривиальна: точка А' лежит в начале координат, точка В' на оси ОХ, а точка С' выше оси ОХ. Найти точку пересечения в этом случае тривиально, описывать не стану.
IMHO, автоматическую генерацию коммитов можно реализовать через поиск убранных "//TODO:" и "//fixme:" и добавленных. Это можно было бы объединить с багтрекером, или issue.
Только до тех пор, пока вместо списка не окажется numpy array, который в случае a = np.asarray([1,2,3]) * 3 выдаст [3, 6, 9].
В этом и минус питона при обучении - скрытость типов данных. На мой взгляд, лучше начинать с С++, Java, любого другого языка, где типы данных указываются явно и нет перегрузки операторов "из коробки".
Такую простую 2д анимацию в питоне лучше сделать через pygame. Если нужно что-то мощнее - DirectX/OpenGL. Второй вариант подойдёт, если ученик интерисуется 3д графикой.
Вы можете использовать JNI, чтобы использовать хвостовую рекурсию и ФП, которое есть в С++. Странен хейт в сторону явы, когда есть JNI, позволяющий писать часть проекта на компилируемом языке, например С++.
Согласен с вами про
Документация функций нужна практически во всех случаях, когда код разбивается на несколько файлов, и время его разработки превышает неделю.
Документация функций и классов позволяет вернуться к старому проекту за несколько часов. Указание параметов, исключений, связанных классов ускоряет понимание роли функции в проекте.
Комментарии в самом коде я оставлю на усмотрение разработчика. Они могут быть нужны в случае
for(int i = 0; i < arr.length;)
, где возникает вопрос, почему значение i не обновляется. Константы в коде тоже должны содержать комментарии, например значения по умолчанию и/или описание поведения при их изменении.Таково моё субъективное мнение про комментирование, интересно узнать ваше.
Я пробовал GeoGebra. В браузере она тормозит, некорректно парсит формулы, например ||x|-1| (\left|\left|x\right|-2\right|), не везде работает Ctrl+Z. Поэтому я выбрал Desmos. Единственное чем GeoGebra лучше Desmos'a лично для меня — возможностью строить трёхмерные уравнения.