public virtual VsElement Clip2D(Clipper clip) { VsPolygon4 ret = new VsPolygon4(this); if (ret.pol.NVertex() >= 3) { ret.pol = clip.Vs_polygon_clip_2d(ret.pol); } return(ret); }
public virtual VsElement Project(Projector proj) { VsPolygon4 ret = new VsPolygon4(this); if (ret.pol.NVertex() >= 3) { ret.pol = ret.pol.Project(proj); } return(ret); }
public virtual VsElement Clip3DF(Clipper clip) { VsPolygon4 ret = new VsPolygon4(this); if (ret.pol.NVertex() >= 3) { ret.pol = clip.Vs_polygon_clip_3df(ret.pol); ret.faceflag = ret.pol.BackfaceCheck(); } return(ret); }
public VsPolygon4(VsPolygon4 p) { type = "VsPolygon4"; col = Color.Black; faceflag = true; mate = new Material(p.mate); mateB = new Material(p.mateB); col = p.col; pol = new Polygon3D(p.pol); faceflag = p.faceflag; }
public virtual VsElement Transform(Matrix44 mat) { VsPolygon4 ret = new VsPolygon4(this); if (ret.pol.NVertex() >= 3) { ret.pol = ret.pol.Transform(mat); ret.faceflag = ret.pol.BackfaceCheck(); } return(ret); }
public static VsElement CreateElement(VsElement elem) { VsElement ret = null; String type = elem.ElemType(); if (type.Equals("VsPoint")) { ret = new VsPoint((VsPoint)elem); } else if (type.Equals("VsPolygon")) { ret = new VsPolygon((VsPolygon)elem); } else if (type.Equals("VsPolygon2")) { ret = new VsPolygon2((VsPolygon2)elem); } else if (type.Equals("VsPolygon3")) { ret = new VsPolygon3((VsPolygon3)elem); } else if (type.Equals("VsPolygon4")) { ret = new VsPolygon4((VsPolygon4)elem); } else if (type.Equals("VsSegment")) { ret = new VsSegment((VsSegment)elem); } else if (type.Equals("VsString")) { ret = new VsString((VsString)elem); } else if (type.Equals("VsString2")) { ret = new VsString2((VsString2)elem); } else if (type.Equals("VsObject")) { ret = new VsObject((VsObject)elem); } return(ret); }
public static VsPolygon4 RegularPolygonM2(int n, Material mate, Material mate2) { double[] x = new double[n]; double[] y = new double[n]; double[] z = new double[n]; double angleStep = 360.0D / n; double startAngle = 270.0D - angleStep / 2.0D; for (int i = 0; i < n; i++) { double angle = startAngle + angleStep * i; if (angle > 360.0D) { angle -= 360.0D; } x[i] = (Math.Cos(MathTool.DegToRad(angle)) / 2.0D); y[i] = (Math.Sin(MathTool.DegToRad(angle)) / 2.0D); z[i] = 0.0D; } VsPolygon4 ret = new VsPolygon4(n, x, y, z, mate, mate2); return(ret); }
private bool Vs_read_form_unit(bool message_mode) { int head_read_order = 0; name = null; vertex = new ArrayList(); fvno = new ArrayList(); obj0 = new VsObject(); depth_sort_sw = 1; scale = 1.0D; while (true) { int c = ReadSkipSpace(); if (c == -1) { if (head_read_order != 0) { System.Console.Out.WriteLine("エラー: 形状フォーム読み込み中に EOF が表れました.vs_read_form_unit()\n"); } return(false); } if ((char)c == '#') { ReadLine(); } else { String command = ((char)c + ReadAWord()).ToUpper(); if (head_read_order == 0) { if (!command.Equals("FORM_UNIT")) { System.Console.Out.WriteLine("エラー: [FORM_UNIT]コマンド以外のコマンド[" + command + "]が最初に表れました.vs_read_form_unit()"); return(false); } name = ReadAWord(); if (message_mode) { System.Console.Out.WriteLine("----------------------------------------"); System.Console.Out.WriteLine("FORM UNIT '" + name + "' READING..."); } head_read_order++; } else if (head_read_order == 1) { if (!command.Equals("DEPTH_SORT")) { System.Console.Out.WriteLine("エラー: [DEPTH_SORT]コマンド以外のコマンド[" + command + "]が2番目に表れました.vs_read_form_unit()"); return(false); } String buf = ReadAWord().ToUpper(); if (buf.Equals("ON")) { depth_sort_sw = 1; head_read_order++; } else if (buf.Equals("OFF")) { depth_sort_sw = 0; head_read_order++; } else { System.Console.Out.WriteLine("エラー: [DEPTH_SORT]コマンドに不当なパラメータ[" + buf + "]が指定されました.vs_read_form_unit()"); return(false); } } else if (head_read_order == 2) { if (!command.Equals("SCALE")) { System.Console.Out.WriteLine("エラー: [SCALE]コマンド以外のコマンド[" + command + "]が3番目に表れました.vs_read_form_unit()"); return(false); } scale = ReadDouble(); if (scale == 0.0D) { System.Console.Out.WriteLine("エラー: [SCALE]コマンド: ゼロが設定されました.vs_read_form_unit()"); return(false); } head_read_order++; } else { if (command.Equals("FORM_END")) { break; } if (command.Equals("VERTEX")) { c = ReadSkipSpace(); if ((char)c != '{') { System.Console.Out.WriteLine("エラー: [VERTEX]コマンド:{ が無いか,または { の前に空白が有りません.vs_read_form_unit()"); return(false); } int check = Vs_read_vertexs(); if (check == -1) { System.Console.Out.WriteLine("エラー: [VERTEX]コマンド: ブロック内文法エラー.vs_read_form_unit()"); return(false); } } else if (command.Equals("POINT")) { String id = ReadAWord(); Color col = mdf.GetColor(id); if (col == null) { System.Console.Out.WriteLine("エラー: [POINT]コマンド: 存在しないマテリアルIDが指定されています.vs_read_form_unit()"); return(false); } ArrayList p = Vs_read_points(); if (p.Count != 1) { System.Console.Out .WriteLine("エラー: [POINT]コマンド: 頂点数が1になっていません.vs_read_form_unit()"); return(false); } obj0.Add(new VsPoint((Vector3D)vertex[((Int32)p[0])], col)); } else if (command.Equals("LINE")) { String id_0 = ReadAWord(); Color col_1 = mdf.GetColor(id_0); if (col_1 == null) { System.Console.Out.WriteLine("エラー: [LINE]コマンド: 存在しないマテリアルIDが指定されています.vs_read_form_unit()"); return(false); } ArrayList p_2 = Vs_read_points(); if (p_2.Count != 2) { System.Console.Out.WriteLine("エラー: [LINE]コマンド: 頂点数が2になっていません.vs_read_form_unit()"); return(false); } Vector3D p0 = new Vector3D((Vector3D)vertex[((Int32)p_2[0])]); Vector3D p1 = new Vector3D((Vector3D)vertex[((Int32)p_2[1])]); obj0.Add(new VsSegment(p0.x, p0.y, p0.z, p1.x, p1.y, p1.z, col_1)); } else if (command.Equals("POLYGON_2")) { String id1 = ReadAWord(); String id2 = ReadAWord(); String type1 = mdf.GetType(id1); String type2 = mdf.GetType(id2); if (!type1.Equals(type2)) { System.Console.Out.WriteLine("エラー: [POLYGON_2]コマンド: 表裏のマテリアルIDが異なっています.vs_read_form_unit()"); return(false); } Color col_3; Color colB; Material mate = null; Material mateB = null; if (type1.Equals("Color")) { col_3 = mdf.GetColor(id1); } else if (type1.Equals("Material")) { mate = mdf.GetMaterial(id1); } if (type2.Equals("Color")) { colB = mdf.GetColor(id2); } else if (type2.Equals("Material")) { mateB = mdf.GetMaterial(id2); } //if (((col_3 == null) && (mate == null)) || ((colB == null) && (mateB == null))) { System.Console.Out.WriteLine("エラー: [POLYGON_2]コマンド: 存在しないマテリアルIDが指定されています.vs_read_form_unit()"); return(false); } ArrayList p_4 = Vs_read_points(); if (p_4.Count < 3) { System.Console.Out .WriteLine("エラー: [POLYGON_2]コマンド: 頂点数が3以下です.vs_read_form_unit()"); return(false); } if (type1.Equals("Color")) { VsPolygon2 pp = new VsPolygon2(); pp.col = col_3; pp.colB = colB; for (int i = 0; i < p_4.Count; i++) { Vector3D ppp = new Vector3D((Vector3D)vertex[((Int32)p_4[i])]); pp.pol.AddVertex(ppp); } obj0.Add(pp); } else { VsPolygon4 pp_5 = new VsPolygon4(); pp_5.mate = mate; pp_5.mateB = mateB; for (int i_6 = 0; i_6 < p_4.Count; i_6++) { Vector3D ppp_7 = new Vector3D((Vector3D)vertex[((Int32)p_4[i_6])]); pp_5.pol.AddVertex(ppp_7); } obj0.Add(pp_5); } } else if (command.Equals("POLYGON_1")) { String id_8 = ReadAWord(); String type = mdf.GetType(id_8); Color col_9; Material mate_10 = null; if (type.Equals("Color")) { col_9 = mdf.GetColor(id_8); } else if (type.Equals("Material")) { mate_10 = mdf.GetMaterial(id_8); } //if ((col_9 == null) && (mate_10 == null)) { System.Console.Out.WriteLine("エラー: [POLYGON_1]コマンド: 存在しないマテリアルIDが指定されています.vs_read_form_unit()"); return(false); } ArrayList p_11 = Vs_read_points(); if (p_11.Count < 3) { System.Console.Out.WriteLine("エラー: [POLYGON_1]コマンド: 頂点数が3以下です.vs_read_form_unit()"); return(false); } if (type.Equals("Color")) { VsPolygon pp_12 = new VsPolygon(); pp_12.col = col_9; for (int i_13 = 0; i_13 < p_11.Count; i_13++) { Vector3D ppp_14 = new Vector3D((Vector3D)vertex[((Int32)p_11[i_13])]); pp_12.pol.AddVertex(ppp_14); } obj0.Add(pp_12); } else { VsPolygon3 pp_15 = new VsPolygon3(); pp_15.mate = mate_10; for (int i_16 = 0; i_16 < p_11.Count; i_16++) { Vector3D ppp_17 = new Vector3D((Vector3D)vertex[((Int32)p_11[i_16])]); pp_15.pol.AddVertex(ppp_17); } obj0.Add(pp_15); } } else if (command.Equals("POLYLINE")) { String id_18 = ReadAWord(); Color col_19 = mdf.GetColor(id_18); if (col_19 == null) { System.Console.Out.WriteLine("エラー: [POLYLINE]コマンド: 存在しないマテリアルIDが指定されています.vs_read_form_unit()"); return(false); } ArrayList p_20 = Vs_read_points(); if (p_20.Count < 2) { System.Console.Out.WriteLine("エラー: [POLYLINE]コマンド: 頂点数が2以下です.vs_read_form_unit()"); return(false); } for (int i_21 = 0; i_21 < p_20.Count - 1; i_21++) { Vector3D p0_22 = new Vector3D((Vector3D)vertex[((Int32)p_20[i_21])]); Vector3D p1_23 = new Vector3D((Vector3D)vertex[((Int32)p_20[i_21 + 1])]); obj0.Add(new VsSegment(p0_22.x, p0_22.y, p0_22.z, p1_23.x, p1_23.y, p1_23.z, col_19)); } } else { System.Console.Out.WriteLine("エラー: 不当なコマンド[" + command + "]が現れました.vs_read_form_unit()"); return(false); } } } } if (message_mode) { String command_24; int c_25; System.Console.Out.WriteLine("<FORM UNIT> NAME:[" + name + "]"); System.Console.Out.WriteLine(" DEPTH SORT SW:[" + depth_sort_sw + "] SCALE FACTOR:[" + scale + "]"); System.Console.Out.WriteLine("NUMBER of VERTEX:[" + vertex.Count + "]"); System.Console.Out.WriteLine("VERTEX:"); for (int i_26 = 0; i_26 < vertex.Count; i_26++) { String vtxId = DispFormat.Lpad(((Int32)fvno[i_26]).ToString(), 3); if (vtxId.Equals("-99")) { vtxId = " "; } System.Console.Out.Write(" " + vtxId + " : "); ((Vector3D)vertex[i_26]).PrintPos(); System.Console.Out.WriteLine(""); } obj0.Print(); System.Console.Out.WriteLine("NUMBER of ELEMENT:" + obj0.element.Count); System.Console.Out.WriteLine("-----------------------------------------------\n"); } return(true); }