Ответы пользователя по тегу Геометрия
  • Как найти расстояние от точки до вектора?

    @Mercury13
    Программист на «си с крестами» и не только
    Откуда начинается вектор?
    Если вектор AB и точка C, то расстояние — это ортогональная СОСТАВЛЯЮЩАЯ |AC×AB| / ||AC||·||AB||.
    a×b — это косое произведение векторов ax·by−ay·bx. В 2D это скаляр. Если убрать модуль в числителе, получится знаковое расстояние — плюс с одной стороны и минус с другой.
    ||a|| — длина вектора sqrt(ax²+ay²). Если есть функция hypot, используй её.
    Ответ написан
    Комментировать
  • Как изменить константу C в общем уравнении прямой Ax+By+C=0 при сдвиге прямой по вектору?

    @Mercury13
    Программист на «си с крестами» и не только
    U=(A,B) — перпендикулярный вектор прямой.
    Тогда dC = PrUV·|U| = U·V
    Всего лишь скалярное произведение.
    Проверка. x + y = 0, U=(1,1), V = (1,2)
    dC = 1·1 + 1·2 = 3, правильно?
    Ответ написан
    Комментировать
  • Как найти координаты точек на дуге зная координаты точек хорды?

    @Mercury13
    Программист на «си с крестами» и не только
    По теореме Пифагора находим расстояние от центра до хорды: d = sqrt(R² − [(x2−x1)² + (y2−y1)²]/4).
    Находим середину отрезка AB (назовём её (x3, y3)). Находим направляющий вектор отрезка AB (x4,y4) = ((x2−x1)/|AB|, (y2−y1)/|AB|), и есть два варианта центра — (x0,y0) = (x3±d·y4, y3∓d·x4).
    А дальше через atan2 получаем углы, упорядочиваем их и через углы получаем сколько угодно точек.
    Ответ написан
  • Как построить треугольник?

    @Mercury13
    Программист на «си с крестами» и не только
    Этот код вычисляет координату верхней вершины треугольника.

    2,3 — полученная обмерами конкретного экрана пропорция пикселя. Расчётная 2,4 = (640·3) / (200·4), и заметно, что на эмуляторе треугольник слегка сплюснутый.
    √3 / 2 — высота треугольника при единичном основании.
    Координаты вершин (100, 160), (400, 160) [основание соответственно 300]. Какие (X, Y) у третьей?
    X3 — среднее между ними, основание 300, ну а Y3 = 160 − 300·(√3 / 2) / aspect.

    Первое, что вам придётся сделать на современном компьютере — избавиться от коэффициента 2,3: пиксели-то сейчас квадратные. Затем как можно больше констант сделать производными. Например:
    TriangleX = 100
    TriangleY = 50
    TringleSide = 300
    Sqr32 = Sqr(3) / 2
    TriangleHeight = TriangleSide * Sqr32
    X1 = TriangleX
    Y1 = TriangleY + TriangleHeight
    X3 = X1 + TriangleSide
    Y3 = Y1
    X2 = X1 + TriangleSide / 2
    Y2 = TriangleY

    UPD. Я поменял местами X2/X3 так, чтобы оно сходилось с экраном. И ты не забудь. То есть, 400 — теперь это будет X3!!!
    Ответ написан
  • Даны 4 последовательные точки, как узнать что образуют они параллелограмм?

    @Mercury13
    Программист на «си с крестами» и не только
    Ну разумеется, по критерию параллелограмма: диагонали пересекаются и точкой пересечения делятся пополам! На языке математики:
    x1 + x3 ≈ x2 + x4
    y1 + y3 ≈ y2 + y4
    Почему «приблизительно равно». Float в принципе неточный, совпадение приходится проверять с точностью в какой-то эпсилон. Какой эпсилон — это уже зависит от задачи.
    Ответ написан
    Комментировать
  • Какие бывают абсолютные геометрии?

    @Mercury13
    Программист на «си с крестами» и не только
    Возможен и такой изврат: в одном месте будут свойства Лобачевского (через точку можно провести кучу прямых, параллельных данной), в другой — Евклида (ровно одну).

    Понятие «расстояние» — |AB| — там есть. Нет понятия «движение», и потому круг нарисовать можно, а нарисовать рядом равный ему, чтобы он имел аналогичные свойства, например, такую же площадь — нет.
    Ответ написан
  • Как нарисовать изгиб мостика под нагрузкой?

    @Mercury13
    Программист на «си с крестами» и не только
    В первом приближении (деформации малы, балка лёгкая) — половина параболы.
    Если точно — решить можно только численно.
    Ответ написан
    Комментировать
  • Как найти координаты прямой d, направленного по биссектрисе угла между двумя прямыми, при условии, что длина бисс прямой с задается с клавиатуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Как я понял, задача такова. Есть угол, заданный вершиной и двумя точками на сторонах. Найти, куда попадёт биссектриса длины 4.

    1. Из координат вершины угла и точек на его сторонах получить векторы-стороны.
    2. Привести векторы-стороны к единой длине (например, разделить на длину).
    3. Их среднее арифметическое — вектор-биссектриса. Если получился нулевой вектор — векторы-стороны смотрят на 180°, и непонятно, в какую сторону считать нашу биссектрису.
    4. Привести вектор-биссектрису к нужной длине (разделив на реальную длину и умножив на требуемую).
    5. Отсчитать этот вектор от вершины угла. Получится координата биссектрисы длины 4, отложенной от точки (3, 4).
    А математика совсем не высшая :)
    Ответ написан
    Комментировать
  • Есть ли алгоритм для наиболее быстрого нахождения включает ли одна фигура другую?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Надо указывать не только то, что все точки первой фигуры внутри второй, но и то, что все точки второй фигуры снаружи первой.
    2. Даже примитивный алгоритм даёт скорость O(mn). Сколько у вас примерно точек?
    3. Можно воспользоваться эвристиками. Если охватывающий прямоугольник 1-й фигуры целиком во 2-й — ДА. Если вылезает из охватывающего прямоугольника 2-й — НЕТ.
    4. Можно поступить так. Отсортируем все точки той фигуры, которую проверяем на точки, по X-координате. Также отсортируем все отрезки той фигуры, которую проверяем на отрезки, по X-координате левой точки. Указатель отрезков ставим в начало перечня отрезков. Заводим список активных отрезков. Проходимся по всем точкам, поступая так…
    • Для всех отрезков в списке активных: если точка вышла из [X1, X2) — исключить из списка!
    • Смотрим на тот отрезок, что под указателем. Если X точки >= X1 — идём по фигуре дальше; если заодно X < X2 и Y выше отрезка (X1,X2 — (Y1,Y2) — включаем отрезок в список.
    При определённом устройстве списка (куча по X2) имеем O(n log n). И если меньшая фигура имеет сложность примерно как у большей (т.е. не логарифм) — имеем выигрыш.
    Ответ написан
  • Как рассчитать глубину полигона (метод z-буфера)?

    @Mercury13
    Программист на «си с крестами» и не только
    Это уже не z-буферизация, а алгоритм художника. Возьмите, например, z-координату центра.
    Ответ написан
    Комментировать
  • Зачем нужны однородные координаты?

    @Mercury13
    Программист на «си с крестами» и не только
    Все распространённые преобразования (сдвиги, повороты, проецирование) можно реализовать матрицей 4×4.
    Ответ написан
    Комментировать