Если ваш треугольник выражен в виде точек, вам нужно будет учитывать каждую координату, поэтому ответ Стива Джессопа почти оптимален.
Обратите внимание, что все, что вам на самом деле нужно сделать, это начать с одной точки и столкнуть ее с двумя другими в ограниченном количестве. Вот что делает усреднение, но очень специфическим способом.
Добавление происходит быстро. Деление может быть медленным в зависимости от платформы и компилятора.
Например, на современных ядрах ARM я бы выбрал эту версию в любой день вместо усреднения:
xm = (x0 + (x1 + x2) / 2) / 2
ym = (y0 + (y1 + y2) / 2) / 2
Если переменные являются целочисленными, компилятор должен оптимизировать деления для сдвигов битов, которые при правильном планировании в ARM в основном бесплатны. Если переменные являются числами с плавающей запятой или удваиваются, компилятор должен оптимизировать их для простого уменьшения экспоненты. Известно, что деление с плавающей запятой относительно медленное.
В конечном итоге, проверьте и посмотрите. Если вы не выполняете оптимизацию кода низкого уровня, вы, скорее всего, не увидите разницы. С другой стороны, если вы используете это в узком внутреннем цикле, вы можете.
Чтобы дать некоторую интуицию относительно того, почему это работает: сначала мы находим среднюю точку отрезка, образованного (x1, y1)
и (x2, y2)
. Затем мы находим среднюю точку между отрезком линии, образованным , точкой и (x0, y0)
. Если вы рисуете диаграмму треугольника и делаете это, сразу становится ясно, что это работает.