recently I came across the problem of the non-convex casting surfaces when performing EnergyPlus analysis.
I checked out and I understood the problem was the exposed floors of the building model that were L shaped, so I understood EnergyPlus doesn’t like that.
I had to remake the algorithm that generate the building model (in different variations) so that the exposed floors were always 4 sided convex surfaces and it worked fine for the energy simulations, but this algorithm or even a simple 3D model like this take longer time.
So the question is: is it possible you realize and include in Honeybee a component that automatically create convex surfaces from non-conves ones? Something similar the component that automatically split the building masses so adjacent zones can have the same contact surface. Thank you!!!
Hi Francesco, It’s a great topic an I have been thinking about it. Yes it is possible an here is the solution if someone has the time to implement it into honeybee. We just need to check isconvex for surfaces with more than 3 points and break them down into surfaces while writing to energyplus.
Read up to ccw: https://www.toptal.com/python/computational-geometry-in-python-from…
Here is the python source code: https://github.com/crm416/point-location/blob/master/geo/shapes.py#…
Hello Mostapha, thank you for the quick reply. Ok then it is possible in some future release of HB there will be this new component or feature. Thank you!
Not sure if this will be helpful but here it goes.
The way to break a non-convex polygon to convex ones seems to be to eliminate reflex vertices. The problem of identifying these reflex vertices is solved, if I understand it correctly (thanks for that Mostapha it’s cool!), by the CCW algorithm. If my visual memory doesn’t fail me, it will always be the middle point (B) of the non-ccw triad of points of a polygon that will be the reflex vertice.
To remove it we could do something like what Bayazit has implemented here (https://mpen.ca/406/bayazit)
extend the edges of the reflex vertice I until they hit an edge (at points I1 and I2)
if there are no vertices between I1 and I2 then create a new vertice in the centre of I1I2 and connect to that.
if there is one or more vertices then connect to the closest one.
In Francesco’s example, you can easily imagine how that works in the corner of the roofs. Actually, for Francesco I was thinking that maybe a postprocessing solution (splitting all convex surfaces with the segments formed from the corner of roof/floor) would be an ugly but faster solution.
In any case, if we can ‘look’ for vertices in Rhino then the above should be straightforward. I might sit down and see how to code this in Python, maybe it could be my initiation o.o
How are you going with this? I’d also be interested in writing a solution as I want to work on my geometry skills. As I understand it your solution should work but how do we find the reflex surfaces?
I’m not really working on it atm. I think the way to find reflex vertices is through the CCW algorithm Mostapha shared. As I said, the middle vertex should be reflex if it is not a CCW triad of points. Perhaps the code in the site shared by Mostapha can work right away and just spit out any reflex vertex out of that in this way.
The next step which I’m not sure is the Rhinoscript required to find the intersections, check for a point in between, etc.