/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- __construct
- GLUT_INIT
- GLUT_CALL_FUNC
- MY_INIT
- display
- reshape
- mouse
- CALC_DATA
- DRAW_LINE
<?php
class Point {
public $x, $y;
function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}
$a = new Point(30, 100);
$b = new Point(200, 250);
/***[計算用パラメータ]***/
class PARAM {
public $dx, $dy;
public $a, $a1, $e;
public $sx, $sy;
public $flag;
};
$param = new PARAM();
/******[OpenGLの初期設定]******************/
function GLUT_INIT()
{
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(400, 400);
}
function GLUT_CALL_FUNC()
{
glutDisplayFunc('display');
glutReshapeFunc('reshape');
glutMouseFunc('mouse');
}
function MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
CALC_DATA();
}
// Main
glutInit($argv);
GLUT_INIT();
glutCreateWindow("window name");
GLUT_CALL_FUNC();
MY_INIT();
glutMainLoop();
exit(0);
function display()
{
global $param;
glColor3d(1, 0, 0);
DRAW_LINE($param->flag);
glFlush();
}
function reshape($w, $h)
{
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, $w, $h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, $w, $h, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
function mouse($button, $state, $x, $y)
{
if( $button == GLUT_LEFT_BUTTON && $state == GLUT_DOWN)
{
printf("click at (%d,%d) \n", $x, $y);
}
}
/*******[ここから、各種関数]******************/
/* 2点から必要なデータを計算 */
function CALC_DATA()
{
global $a, $b;
global $param;
$param->dx = abs($a->x - $b->x);
$param->dy = abs($a->y - $b->y);
$a->x > $b->x ? ($param->sx = -1) : $param->sx = 1;
$a->y > $b->y ? ($param->sy = -1) : $param->sy = 1;
if ($param->dx >= $param->dy) {
$param->a = 2 * $param->dy;
$param->a1 = $param->a - (2 * $param->dx);
$param->e = $param->a - $param->dx;
$param->flag = 0;
} else {
$param->a = 2 * $param->dx;
$param->a1 = $param->a - (2 * $param->dy);
$param->e = $param->a - $param->dy;
$param->flag = 1;
}
}
/* プレゼンハムで描画 */
function DRAW_LINE($flag)
{
global $a, $b;
global $param;
$x = $a->x;
$y = $a->y;
if($param->flag == 0) { //xで走査
for($x = $a->x ; ($param->sx >=0 ? $x<= $b->x : $x>=$b->x) ; $x+=$param->sx) {
glBegin(GL_POINTS);
glVertex2i($x, $y);
glEnd();
if($param->e >= 0) {
$y += $param->sy;
$param->e += $param->a1;
} else {
$param->e += $param->a;
}
}
} else { //yで走査
for ($y = $a->y; ($param->sy >=0 ? $y<= $b->y : $y>=$b->y) ; $y+=$param->sy) {
glBegin(GL_POINTS);
glVertex2i($x, $y);
glEnd();
if ($param->e>=0) {
$x += $param->sx;
$param->e += $param->a1;
} else {
$param->e += $param->a;
}
}
}
}