質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
F#

F#は、MicroSoftが開発した.NET Framework 向けのマルチパラダイムプログラミング言語です。 Visual Studio 2010 より標準搭載されました。

Q&A

解決済

1回答

2590閲覧

正二十面体の作成の仕方

masaizokumoai1

総合スコア12

F#

F#は、MicroSoftが開発した.NET Framework 向けのマルチパラダイムプログラミング言語です。 Visual Studio 2010 より標準搭載されました。

0グッド

1クリップ

投稿2017/07/23 07:02

編集2017/07/28 07:52

F#とOpenTKを用いて正二十面体を描画したいのですが、どのようなコードを記述すればいいのかわからなくなりました。
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); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2017/07/24 08:39

イメージ説明のリンクが切れているようで「ページが見つかりません。」になります。
masaizokumoai1

2017/07/29 08:22

Gになるところを(仮にG/2=g)とも設定できてないし0になるところを引き算できてないようです。座標の書き方が間違っているようです。メチャクチャですね
guest

回答1

0

自己解決

/// Creates a 3D icosahedron of unit size using the current color let icosa = DF (fun ctx -> GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Diffuse, ctx.Color) GL.Begin(BeginMode.Triangles) let G = float32 ((1.0 + Math.Sqrt(5.0)) * 0.5) GLEx.Face ( 1.f, 0.f, G) [ ( 1.0f, 0.0f, G); ( 0.0f, -G, 1.0f); ( G, -1.0f, 0.0f); ( 1.0f, 0.0f, G); (-1.0f, 0.0f, G); ( 0.0f, -G, 1.0f); ( 1.0f, 0.0f, G); ( G, 1.0f, 0.0f); ( G, -1.0f, 0.0f); ( 1.0f, 0.0f, G); (-1.0f, 0.0f, G); ( 0.0f, G, 1.0f); ( 1.0f, 0.0f, G); ( 0.0f, G, 1.0f); ( G, 1.0f, 0.0f) ] GLEx.Face (G, 1.f, 0.f) [ ( G, 1.0f, 0.0f); ( G, -1.0f, 0.0f); ( 1.0f, 0.0f, -G) ] GLEx.Face (0.f, G, -1.f) [ ( 0.0f, G, -1.0f); (-1.0f, 0.0f, -G); ( 1.0f, 0.0f, -G); ( 0.0f, G, -1.0f); ( G, 1.0f, 0.0f); ( 1.0f, 0.0f, -G); ( 0.0f, G, -1.0f); ( G, 1.0f, 0.0f); ( 0.0f, G, 1.0f); ( 0.0f, G, -1.0f); ( 0.0f, G, 1.0f); (-G, 1.0f, 0.0f); ( 0.0f, G, -1.0f); (-G, 1.0f, 0.0f); (-1.0f, 0.0f, -G) ] GLEx.Face (-G, 1.f, 0.f) [ (-G, 1.0f, 0.0f); (-1.0f, 0.0f, G); ( 0.0f, G, 1.0f) ] GLEx.Face (-G, -1.f, 0.f) [ (-G, -1.0f, 0.0f); ( 0.0f, -G, 1.0f); (-1.0f, 0.0f, G); (-G, -1.0f, 0.0f); (-G, 1.0f, 0.0f); (-1.0f, 0.0f, -G); (-G, -1.0f, 0.0f); (-G, 1.0f, 0.0f); (-1.0f, 0.0f, G) ] GLEx.Face (0.f, -G, -1.f) [ ( 0.0f, -G, -1.0f); ( 0.0f, -G, 1.0f); ( G, -1.0f, 0.0f); ( 0.0f, -G, -1.0f); ( G, -1.0f, 0.0f); ( 1.0f, 0.0f, -G); ( 0.0f, -G, -1.0f); ( 1.0f, 0.0f, -G); (-1.0f, 0.0f, -G); ( 0.0f, -G, -1.0f); (-1.0f, 0.0f, -G); (-G, -1.0f, 0.0f); ( 0.0f, -G, -1.0f); (-G, -1.0f, 0.0f); ( 0.0f, -G, 1.0f) ] GL.End() )

投稿2017/08/18 23:10

masaizokumoai1

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問