我有一個幾何問題:
考慮以下等距網格,其中中心為 (0, 0),三角形的邊長為一個單位:

如何獲得所有單個三角形的坐標,包括不完整的三角形?
我嘗試簡單地將寬度和高度除以不同的因素,但我似乎找不到始終包含部分三角形的公式。
uj5u.com熱心網友回復:
一種方法:
三角形中心的坐標只是它三個頂點的平均值。
s由于網格是垂直對齊的,您可以通過簡單地在 Y 軸上加上/減去三角形的一條邊的長度,在垂直方向(上下)找到部分三角形的缺失頂點。(√3/2)s因為這些是等邊三角形,您可以通過添加/減去現有頂點之一的 X 軸并設定 Y 軸來找到在水平方向(左右)具有 2 個可見頂點的部分三角形的缺失頂點值是兩個現有頂點的 Y 值的平均值。您可以通過從具有兩個可見頂點的相鄰水平三角形中獲取在水平方向上只有一個可見頂點的部分三角形的缺失頂點來找到它們。部分角三角形(只有一個頂點)可以擴展如下:首先應用上面的規則(2)得到垂直缺失的頂點。其次,既然您知道兩個頂點,您可以通過應用上面的規則(3)來獲得水平缺失的頂點。
請注意,這不是唯一的方法,甚至不一定是最簡單的方法。
uj5u.com熱心網友回復:
我是這樣看的:

黃色是網格上的點,Aqua 是網格的各個三角形。所以定義基向量u,v,w,然后將網格點位置(i,j)轉換為(x,y). 這可用于使用每個索引的三角形索引奇偶校驗來形成三角形(4 種可能的情況)......這里是小的 C /OpenGL 2D 示例:
//---------------------------------------------------------------------------
void get_hexpoint(double *p,int i,int j) // i,j yellow
{
static const double deg=M_PI/180.0; // deg -> rad
static const double u[2]={ cos(30.0*deg),-sin(30.0*deg)};
static const double v[2]={ cos(30.0*deg), sin(30.0*deg)};
static const double w[2]={ 0.0 , 1.0 };
double ii=i,jj=j;
for (i=0;i<2;i ) p[i]=0.0;
for (i=0;i<2;i ) p[i] =(ii*u[i]) (jj*w[i]);
}
//---------------------------------------------------------------------------
void get_hextriangle(double *p0,double *p1,double *p2,int i,int j) // i,j aqua
{
if (int(j&1)==0)
{
j=(j>>1) (i>>1);
if (int(i&1)==0)
{
get_hexpoint(p0,i,j);
get_hexpoint(p1,i 1,j);
get_hexpoint(p2,i 1,j 1);
}
else{
get_hexpoint(p0,i,j);
get_hexpoint(p1,i,j 1);
get_hexpoint(p2,i 1,j 1);
}
}
else{
j=(j>>1) (i>>1);
if (int(i&1)==0)
{
get_hexpoint(p0,i,j);
get_hexpoint(p1,i 1,j 1);
get_hexpoint(p2,i,j 1);
}
else{
j ;
get_hexpoint(p0,i,j);
get_hexpoint(p1,i 1,j);
get_hexpoint(p2,i 1,j 1);
}
}
}
//---------------------------------------------------------------------------
void TMain::draw()
{
scr.cls();
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScalef(0.2,0.2,1.0);
int i,j,n=10;
double p0[2],p1[2],p2[2];
glLineWidth(3);
for (i=-n;i<= n;i )
for (j=-n;j<= n;j )
{
get_hextriangle(p0,p1,p2,i,j);
glColor3f(0.2,0.2,0.2);
glBegin(GL_TRIANGLES);
glVertex2dv(p0);
glVertex2dv(p1);
glVertex2dv(p2);
glEnd();
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_LOOP);
glVertex2dv(p0);
glVertex2dv(p1);
glVertex2dv(p2);
glEnd();
}
glLineWidth(1);
scr.exe();
scr.rfs();
}
//---------------------------------------------------------------------------
這里的輸出:

請注意,可以通過稍微更改邏輯將 if 陳述句移動到點索引增量或使用 LUT 來將 4 個案例分支轉換為無早午餐代碼......但我懶得這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410214.html
標籤:
上一篇:假設一個陣列只包含兩種元素,如何快速找到它們的邊界?
下一篇:使用聯合查找回傳正確數量的島嶼
