F#とOpenTKを用いて正二十面体を描画したいのですが、どのようなコードを記述すればいいのかわからなくなりました。
こちらのコードを実行すると
このように表示され、正二十面体にならないので非常に困っています。
正二十面体はどのようにして記述できるかというコード詳細をご教授願えないでしょうか?
F#+OpenTK
1type GLEx = 2 /// Add multiple vertices to GL 3 static member Vertices vertices = 4 for (x:float32), y, z in vertices do 5 GL.Vertex3(x, y, z) 6 7 /// Add mesh to the GL and set the specified normal vector first 8 static member Face (x:float32, y, z) vertices = 9 GL.Normal3(x, y, z) 10 GLEx.Vertices vertices
F#+OpenTK
1let cube = DF (fun ctx -> 2 GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Diffuse, ctx.Color) 3 GL.Begin(BeginMode.Quads) 4 GLEx.Face 5 (-1.f, 0.f, 0.f) 6 [ (-0.5f, -0.5f, -0.5f); (-0.5f, -0.5f, 0.5f); 7 (-0.5f, 0.5f, 0.5f); (-0.5f, 0.5f, -0.5f) ] 8 GLEx.Face 9 ( 1.f, 0.f, 0.f) 10 [ ( 0.5f, -0.5f, -0.5f); ( 0.5f, -0.5f, 0.5f); 11 ( 0.5f, 0.5f, 0.5f); ( 0.5f, 0.5f, -0.5f) ] 12 GLEx.Face 13 (0.f, -1.f, 0.f) 14 [ (-0.5f, -0.5f, -0.5f); (-0.5f, -0.5f, 0.5f); 15 ( 0.5f, -0.5f, 0.5f); ( 0.5f, -0.5f, -0.5f) ] 16 GLEx.Face 17 (0.f, 1.f, 0.f) 18 [ (-0.5f, 0.5f, -0.5f); (-0.5f, 0.5f, 0.5f); 19 ( 0.5f, 0.5f, 0.5f); ( 0.5f, 0.5f, -0.5f) ] 20 GLEx.Face 21 (0.f, 0.f, -1.f) 22 [ (-0.5f, -0.5f, -0.5f); (-0.5f, 0.5f, -0.5f); 23 ( 0.5f, 0.5f, -0.5f); ( 0.5f, -0.5f, -0.5f) ] 24 GLEx.Face 25 (0.f, 0.f, 1.f) 26 [ (-0.5f, -0.5f, 0.5f); (-0.5f, 0.5f, 0.5f); 27 ( 0.5f, 0.5f, 0.5f); ( 0.5f, -0.5f, 0.5f) ] 28 GL.End() )
となるわけで正六面体(=立方体)24箇所座標があるということは
正二十面体では12箇所では足りないのではと思いまして
とりあえず
必要なことは
(各頂点数×一点に集約される面数÷正N面体の面数分)
=一つ分の面の座標かなと。
下記のjavaの正二十面体のプログラムをF#にコンバートすることはできませんか?誰かよろしくお願いします。
import java.applet.*; import java.awt.*; import com.sun.j3d.utils.picking.behaviors.PickRotateBehavior; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; public class Icosahedron2 extends Applet{ private static final long serialVersionUID = 1L; private SimpleUniverse u = null; public void init(){ int i; //<set layout of applet, construct canvas3d, add canvas3d> setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3d = new Canvas3D(config); add(canvas3d, BorderLayout.CENTER); //create scene graph BranchGroup root = new BranchGroup(); Transform3D tr = new Transform3D(); tr.setScale(0.48); TransformGroup tg = new TransformGroup(tr); root.addChild(tg); //appearance for polygon Appearance ap = new Appearance(); Material mt = new Material(); mt.setLightingEnable(true); ap.setMaterial(mt); PolygonAttributes pa = new PolygonAttributes(); pa.setBackFaceNormalFlip(true); pa.setCullFace(PolygonAttributes.CULL_NONE); ap.setPolygonAttributes(pa); //coordinates of vertices Point3f[] vertices = new Point3f[12]; float x = (float) ((1+Math.sqrt(5))/2); vertices[0] = new Point3f( 1, x, 0); vertices[1] = new Point3f(-1, x, 0); vertices[2] = new Point3f(-1, -x, 0); vertices[3] = new Point3f( 1, -x, 0); vertices[4] = new Point3f( 0, 1, x); vertices[5] = new Point3f( 0, -1, x); vertices[6] = new Point3f( 0, -1, -x); vertices[7] = new Point3f( 0, 1, -x); vertices[8] = new Point3f( x, 0, 1); vertices[9] = new Point3f( x, 0, -1); vertices[10] = new Point3f(-x, 0, -1); vertices[11] = new Point3f(-x, 0, 1); //polygon of 3 rectangles QuadArray geometry = new QuadArray(12, QuadArray.COORDINATES | QuadArray.NORMALS | QuadArray.COLOR_3); geometry.setCoordinates(0, vertices); for(i=0; i<4; i++) geometry.setNormal(i, new Vector3f(0, 0, 1)); for(i=4; i<8; i++) geometry.setNormal(i, new Vector3f(1, 0, 0)); for(i=8; i<12; i++) geometry.setNormal(i, new Vector3f(0, 1, 0)); for(i=0; i<4; i++) geometry.setColor(i, new Color3f(Color.RED)); for(i=4; i<8; i++) geometry.setColor(i, new Color3f(Color.GREEN)); for(i=8; i<12; i++) geometry.setColor(i, new Color3f(Color.BLUE)); Shape3D s3d = new Shape3D(geometry); s3d.setAppearance(ap); tg.addChild(s3d); //wire frame for(i=0; i<12; i++){ for(int j=i; j<12; j++){ if (vertices[i].distance(vertices[j]) < 2.1f){ LineArray ends = new LineArray(2, GeometryArray.COORDINATES); Point3f vertex[] = new Point3f[2]; vertex[0] = vertices[i]; vertex[1] = vertices[j]; ends.setCoordinates(0, vertex); Shape3D line = new Shape3D(ends); tg.addChild(line); } } } //lighting BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); Color3f color = new Color3f(1.0f, 1.0f, 1.0f); // white light Vector3f direction = new Vector3f(4.0f,5.0f,-10.0f); DirectionalLight light = new DirectionalLight(color,direction); light.setInfluencingBounds(bounds); root.addChild(light); //picking BoundingSphere bounds2 = new BoundingSphere(new Point3d(0.0,0.0,0.0), 0.1); PickRotateBehavior prb = new PickRotateBehavior(root,canvas3d,bounds2); //left button root.addChild(prb); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); tg.setCapability(TransformGroup.ENABLE_PICK_REPORTING); u = new SimpleUniverse(canvas3d); u.getViewingPlatform().setNominalViewingTransform(); u.addBranchGraph(root); } }
イメージ説明のリンクが切れているようで「ページが見つかりません。」になります。
Visual Studioのフォーラムにも投稿されていてそこでいくつ回答をもらっているようですね。https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/df09b852-39eb-43e3-8cad-268b96d35b64?forum=vsgeneralja
Gになるところを(仮にG/2=g)とも設定できてないし0になるところを引き算できてないようです。座標の書き方が間違っているようです。メチャクチャですね
回答1件
あなたの回答
tips
プレビュー