Texture2Dをスクリプトで弄って多角形を書いてみた。
Unityというよりは画像処理とか線形数学よりなメモ。
まず多角形を書くために頂点の位置を計算する。
半径1の円を考えると、座標 ( Cos(radian) , Sin(radian) ) が頂点になる
n角形の頂点をUnity的に書くと、
1 2 |
for(int i=0;i<n;i++) new Vector2(Mathf.Cos(i*2*Mathf.PI/n),Mathf.Sin(i*2*Mathf.PI/n))*radius; |
となる。
次に頂点同士を結ぶ線を引いて、座標がその上にあるかどうかを判別する。
頂点A と 頂点B 上に点C があるかどうか調べるには、
ベクトルACとベクトルBCの内積が -radius^2 ( Cos(PI) * radius * radius ) かどうかを見る。
以上をあわせて、結果をQuadに載せてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Polygon : MonoBehaviour { int rad = 500; void Start () { Texture2D tex3 = new Texture2D(rad*2,rad*2); Texture2D tex5 = new Texture2D(rad*2,rad*2); Texture2D tex6 = new Texture2D(rad*2,rad*2); Texture2D tex7 = new Texture2D(rad*2,rad*2); makePolygon(3,tex3); makePolygon(5,tex5); makePolygon(6,tex6); makePolygon(7,tex7); GameObject.Find("Quad" ).GetComponent<Renderer>().material.mainTexture = tex3; GameObject.Find("Quad2").GetComponent<Renderer>().material.mainTexture = tex5; GameObject.Find("Quad3").GetComponent<Renderer>().material.mainTexture = tex6; GameObject.Find("Quad4").GetComponent<Renderer>().material.mainTexture = tex7; tex3.Apply(); tex5.Apply(); tex6.Apply(); tex7.Apply(); } void makePolygon(int num,Texture2D tex) { Vector2[] va = new Vector2[num]; for(int n=0; n<num; n++){ va[n] = new Vector2(Mathf.Cos(n*2*Mathf.PI/num),Mathf.Sin(n*2*Mathf.PI/num))*rad; } Vector2 _t1,_t2; for(int j=0;j<tex.height;j++) for(int i=0;i<tex.width;i++){ bool tb=false; for(int n=0; n<num; n++){ _t1 = va[n]; _t2 = n+1==num?va[0]:va[n+1]; if( isSameLine( _t1, new Vector2(i-rad,j-rad), _t2) ) tb=true; } if(tb) tex.SetPixel(i, j, Color.red); else tex.SetPixel(i, j, Color.white); } } bool isSameLine(Vector2 a,Vector2 b,Vector2 c){ Vector2 t1 = b - a, t2 = b - c; float mag1 = t1.magnitude, mag2 = t2.magnitude; float t = t1.x * t2.x + t1.y * t2.y; float cos180 = -1f; return Mathf.Abs(mag1*mag2*cos180-t)<5; } } |
画面はこんな感じになる。
直線判定の部分で誤差を多めにとったが頂点付近が薄くなる。
なんとなくやってみたけど使い道なさそう。