/// <summary></summary> public List<MeepBlock> FromPolygon(PointD[] vertices) { List<MeepBlock> list = new List<MeepBlock>(); PointD[] tetragon; for( int i = 0 ; i < vertices.Length / 2 - 1 ; i++ ) { tetragon = new PointD[4]; tetragon[0] = vertices[i]; tetragon[1] = vertices[i + 1]; tetragon[2] = vertices[vertices.Length - i - 2]; tetragon[3] = vertices[vertices.Length - i - 1]; foreach( MeepBlock geometricObj in FromTetragon( tetragon ) ) list.Add( geometricObj ); } return list; }
/// <summary></summary> public List<MeepBlock> FromTetragon(PointD[] vertices) { if( vertices.Length != 4 ) throw new ArgumentException(); List<MeepBlock> list = new List<MeepBlock>(); List<PointD> _vertices = new List<PointD>(); // 三角形判定用リスト for( int i = 4 ; i < 8 ; i++ ) if( vertices[i % 4] != vertices[( i - 1 ) % 4] ) _vertices.Add( vertices[i % 4] ); if( _vertices.Count == 3 ) foreach( MeepBlock geometricObj in FromTriangle( _vertices.ToArray() ) ) list.Add( geometricObj ); if( _vertices.Count == 4 ) { foreach( MeepBlock geometricObj in FromTriangle( new[] { vertices[0], vertices[1], vertices[2] } ) ) list.Add( geometricObj ); foreach( MeepBlock geometricObj in FromTriangle( new[] { vertices[2], vertices[3], vertices[0] } ) ) list.Add( geometricObj ); } return list; }
private static bool Equals(PointD a, PointD b) { return Math.Sqrt( Math.Pow( a.X - b.X, 2 ) + Math.Pow( a.Y - b.Y, 2 ) ) <= Accuracy; }
private MeepVector3 Convert(PointD p, double z) { return new MeepVector3( p.X, p.Y, z ); }
/// <summary></summary> public MeepBlock FromParallelogram(PointD origin, SizeD vector1, SizeD vector2) { MeepVector3 center = Convert( origin + 0.5 * vector1 + 0.5 * vector2, CenterZ ); MeepVector3 size = new MeepVector3( vector1.Magnitude, vector2.Magnitude, SizeZ ); return new MeepBlock( MeepMaterial, center, size ) { E1 = Convert( ( 1 / vector1.Magnitude ) * vector1, 0 ), E2 = Convert( ( 1 / vector2.Magnitude ) * vector2, 0 ), E3 = MeepVector3.AxisZ, }; }
/// <summary></summary> public List<MeepBlock> FromTriangle(PointD[] vertices) { if( vertices.Length != 3 ) throw new ArgumentException(); List<MeepBlock> list = new List<MeepBlock>(); if( vertices[0] == vertices[1] || vertices[1] == vertices[2] ) return list; list.Add( FromParallelogram( vertices[0], 0.5 * ( vertices[1] - vertices[0] ), 0.5 * ( vertices[2] - vertices[0] ) ) ); list.Add( FromParallelogram( vertices[1], 0.5 * ( vertices[2] - vertices[1] ), 0.5 * ( vertices[0] - vertices[1] ) ) ); list.Add( FromParallelogram( vertices[2], 0.5 * ( vertices[0] - vertices[2] ), 0.5 * ( vertices[1] - vertices[2] ) ) ); return list; }