Показать сообщение отдельно
Старый 26.02.2013, 03:19   #3
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Simplex noise 2d 3d 4d

гексагон с 25% лишних точек.



using UnityEngine;
using System;


public class 
CreateHexagone MonoBehaviour {
    public 
int width=10;
    
// Use this for initialization
    
void Start () {
            
//ставлю точки
            
Vector3[] vert = new Vector3[(width+1)*(width+1)];
            
Vector3[] normals = new Vector3[(width+1)*(width+1)];
            
Vector2[] uv = new Vector2[(width+1)*(width+1)];
            
//синусокосинус 45 градусов
            
float cosin =(float)Math.Sqrt (Math.PI*0.25f);
            for(
int i 0i<=widthi++){
                for( 
int j 0j<=widthj++){
                
//поворот на 45 градусов и сжатие по одной оси на корень из двух пока треугольник не станет правильным        
                    
float xCoor =(i-j)*cosin;
                    
float zCoor =(i+j-width)*0.5f;
                    
float yCoor 0;
                    
vert[i*(width+1)+j] = new Vector3(xCoor,yCoor,zCoor);
                    
normals[i*(width+1)+j] = new Vector3(0,1,0);
                    
uv[i*(width+1)+j] = new Vector2(xCoor,zCoor);
            }}    
            
//ставлю треугольники
            
int[] trians = new int[3*2*width*width];
            
int trianIndex =0;
            for(
int i 0i<widthi++){
                for( 
int j 0j<widthj++){
                    
int v0 i*(width+1)+j;
                    
int v1 v0+1;
                    
int v2 v0+width+1;
                    
int v3 v2+1;
                
//прямая -x+y-0.5*width=0 и прямая -x+y+0.5*width=0
                //точка (i,j)
                //расстояние от прямой d = (-1*i + 1*j+0.5*width)/sqrt(2)
                //так как нужен только знак то все проще
                
float d0 = -i+j+0.5f*width;
                
float d1 = -i+j-0.5f*width;
                if(
d0>=&& d1<0){
                    
trians[trianIndex+0]=v0;
                    
trians[trianIndex+1]=v1;
                    
trians[trianIndex+2]=v3;
                    
trianIndex+=3;
                }
                if(
d0>&& d1<=0){
                    
trians[trianIndex+0]=v0;
                    
trians[trianIndex+1]=v3;
                    
trians[trianIndex+2]=v2;
                    
trianIndex+=3;
                }
            }}
            
gameObject.AddComponent("MeshFilter");
            
Mesh mesh GetComponent<MeshFilter>().mesh;
            
mesh.Clear();
            
mesh.vertices vert;
            
mesh.uv uv;
            
mesh.triangles trians;
            
mesh.normals normals;
    }
    
    
// Update is called once per frame
    
void Update () {
    
    }

(Offline)
 
Ответить с цитированием