Алгоритм дискретизации поверхности

Моя проблема под рукой:

У меня есть поверхность произвольной формы в Sketchup, и я хочу проверить, какая часть поверхности находится в тени, а какая — на солнце.

Мой подход заключается в создании точек на поверхности и последующей проверке наличия препятствий между каждой точкой и текущим положением солнца. Я должен добавить, что мне нужно будет знать, какие точки будут в тени, а какие под прямыми солнечными лучами, то есть знания о том, что 30% поверхности затенены, недостаточно для того, что я хочу сделать.

  1. Кто-нибудь знает достаточно о Ruby API Sketchup, чтобы рассказать мне, как создавать точки? Я нашел объект PolygonMesh, который может быть мне полезен, но не смог заставить его работать.

  2. Вместо этого, какие общие алгоритмы я мог бы/должен прочитать, чтобы создать точки?

  3. Есть ли лучший подход в Sketchup или вообще, который мог бы достичь того, что я хочу?

Огромное спасибо


person pandita    schedule 20.06.2013    source источник


Ответы (1)


Я добился некоторого прогресса!

Один из вариантов — создать точку в центре масс. Для того, что я называю правильными многоугольниками, то есть там, где вершины распределены равномерно (например, треугольник или прямоугольник), координаты центра масс равны

x_com = average(vertices.x)
y_com = average(vertices.y)
z_com = average(vertices.z)

Подробнее см. здесь: http://www.mathworks.com/matlabcentral/newsreader/view_thread/22176

Это позволит создать точку построения в центре масс, например:

# Find the centre of mass of a polygon based on the average of the x, y, z values.
# A construction point is added to the centre of mass

def centreofmass(aface)
    mod = Sketchup.active_model # Open model
    ent = mod.entities # All entities in model
    vert = aface.vertices
    n = 0
    x = 0
    y = 0
    z = 0

    vert.each{|i|
    n += 1
    x += i.position[0]
    y += i.position[1]
    z += i.position[2]
    }

    pt =  Geom::Point3d.new(x/n,y/n,z/n)
    c = ent.add_cpoint pt
end

Оттуда я, вероятно, мог бы создавать треугольники, рисуя линии от центра масс к исходным вершинам. Затем повторите процесс для новых треугольников.

Это может работать для большинства поверхностей правильной формы. Я считаю, что могут быть проблемы с многоугольниками, у которых больше вершин с одной стороны, чем с другой, а также с многоугольниками неправильной формы, например. тонкие L-образные поверхности.

В любом случае, похоже, у меня есть отправная точка.

person pandita    schedule 21.06.2013