#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<GL/glut.h>
void drawCircle(double x, double y, double radius)
{
int i;
double PI=3.14159;
int CIRCLE_RES=60;
glBegin(GL_POLYGON);
for(i=0; i<CIRCLE_RES; i++)
glVertex2f(x + radius * cos((2. * PI * i) / CIRCLE_RES),
y + radius * sin((2. * PI * i) / CIRCLE_RES));
glEnd();
}
void display()
{
int i, j;
int n=10; // サイト数
double x[100], y[100]; // サイトの座標
double Lx[100]; // ラベルの幅。サイト毎に指定。
double Ly; // ラベルの高さ。一定。
double LPx[1000], LPy[1000]; // ラベル候補の左下の角の座標
int site[1000]; // ラベル候補iがサイトjのものならsite[i]=j
int JOTAI[1000]; // ラベル候補の状態。
// 2ならラベル(位置決定)、なら候補(初期状態と同じ)
// 0なら削除されている。
srand((unsigned int)time(NULL));
rand(); // バグ対策
glColor3f(0.0, 0.0, 0.0);
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
for( i=1; i<=n; i++ ) {
// サイトの座標を乱数で指定(からまで)
x[i] = rand()%1000+1;
y[i] = rand()%1000+1;
// ラベルの幅を乱数で指定(からまで刻み)
Lx[i] = rand()%18 * 10 + 30;
}
// ラベルの高さを指定
Ly = 30;
// 各サイトに対し個のラベル候補を作成(座標)
for( i=1; i<=n*4; i+=4 ) {
site[i] = site[i+1] = site[i+2] = site[i+3] = i/4+1;
LPx[i] = x[site[i]]; LPy[i] = y[site[i]];
LPx[i+1] = x[site[i]]-Lx[site[i]]; LPy[i+1] = y[site[i]];
LPx[i+2] = x[site[i]]-Lx[site[i]]; LPy[i+2] = y[site[i]]-Ly;
LPx[i+3] = x[site[i]]; LPy[i+3] = y[site[i]]-Ly;
}
// 各サイトに対し個のラベル候補を作成(状態)
for( i=1; i<=n*4; i++ ) {
JOTAI[i] = 1;
}
JOTAI[1] = 2; // 何らかの処理により、位置が決まったとする。
JOTAI[2] = 0; // 同じサイトの他のラベル候補は削除。
JOTAI[3] = 0;
JOTAI[4] = 0;
// 頂点の表示
for( i=1; i<=n; i++ ) {
drawCircle(x[i],y[i],10.0);
}
// ラベル候補の表示
for( i=1; i<=n*4; i++ ) {
if( JOTAI[i]== 1 ) {
glBegin(GL_LINE_LOOP);
glVertex2f(LPx[i], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]+Ly);
glVertex2f(LPx[i], LPy[i]+Ly);
glEnd();
}
else if( JOTAI[i]== 0 ) {
glBegin(GL_LINE_LOOP);
glVertex2f(LPx[i], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]+Ly);
glVertex2f(LPx[i], LPy[i]+Ly);
glEnd();
glBegin(GL_LINES); // ×印
glVertex2f(LPx[i], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]+Ly);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]);
glVertex2f(LPx[i], LPy[i]+Ly);
glEnd();
}
else if( JOTAI[i]== 2 ) {
glLineWidth(3.0); // 線を太く
glBegin(GL_LINE_LOOP);
glVertex2f(LPx[i], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]);
glVertex2f(LPx[i]+Lx[site[i]], LPy[i]+Ly);
glVertex2f(LPx[i], LPy[i]+Ly);
glEnd();
glLineWidth(1.0); // 元の太さに
}
}
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitWindowSize(400,400); // ウィンドウサイズはx400ドット
glutInitWindowPosition(600,300); // ウィンドウサイズの表示位置の指定
glutCreateWindow("simple");
printf("開始します。何かキーを押してください。"); getchar();
// 表示領域の範囲指定(.0から.0)まで。
glOrtho(0.0, 1000.0, 0.0, 1000.0, -1.0, 1.0);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}