#include "DxLib.h"
#include <math.h>
#define MAX_Y 500
#define MAX_X 500
typedef struct tag_Point {
int x;
int y;
} Point;
int init_window();
void proc();
void draw_back();
void draw_triangle(Point p1, Point p2, Point p3);
int check(Point p1, Point p2, Point p3);
int isLeftDown();
int isRightDown();
///////////////////////////////////////////////
// main
///////////////////////////////////////////////
int WINAPI WinMain(
HINSTANCE hIns, HINSTANCE hPIns, LPSTR cl, int ncs
) {
if (init_window() == -1)
return 1;
proc();
DxLib_End();
return 0;
}
///////////////////////////////////////////////
// 初期化
///////////////////////////////////////////////
int init_window()
{
ChangeWindowMode(TRUE);
SetGraphMode(MAX_X, MAX_Y, 32) ;
if (DxLib_Init() == -1)
return -1;
SetDrawScreen(DX_SCREEN_BACK);
return 0;
}
///////////////////////////////////////////////
// 描画・位置計算など
///////////////////////////////////////////////
void proc()
{
Point A, B, C, tmp;
A.x = MAX_X/2; A.y = MAX_Y/2;
B.x = MAX_X/4; B.y = MAX_Y/4;
C.x = MAX_X/4*3; C.y = MAX_Y/4;
while (ProcessMessage() != -1) {
ClsDrawScreen();
draw_back();
draw_triangle(A, B, C);
if (isLeftDown()) {
GetMousePoint(&tmp.x, &tmp.y);
B.x = tmp.x;
B.y = MAX_Y - tmp.y;
}
if (isRightDown()) {
GetMousePoint(&tmp.x, &tmp.y);
C.x = tmp.x;
C.y = MAX_Y - tmp.y;
}
ScreenFlip();
}
}
///////////////////////////////////////////////
// 背景
///////////////////////////////////////////////
void draw_back()
{
DrawBox(0, 0, MAX_X, MAX_Y, GetColor(255,255,255), TRUE);
DrawLine(0, MAX_Y/2, MAX_X, MAX_Y/2, GetColor(0,0,0));
DrawLine(MAX_X/2, 0, MAX_X/2, MAX_Y, GetColor(0,0,0));
}
///////////////////////////////////////////////
// 三角形
///////////////////////////////////////////////
void draw_triangle(Point p1, Point p2, Point p3)
{
int col;
if (check(p1, p2, p3) == -1)
col = GetColor(255,127,127);
else
col = GetColor(127,127,255);
DrawTriangle(p1.x, MAX_Y-p1.y,
p2.x, MAX_Y-p2.y,
p3.x, MAX_Y-p3.y,
col, TRUE);
}
///////////////////////////////////////////////
// 半時計回りかどうか
///////////////////////////////////////////////
int check(Point p1, Point p2, Point p3)
{
double r1, r2;
double PI = 3.141592;
r1 = atan2((p2.y-p1.y),(p2.x-p1.x));
r2 = atan2((p3.y-p1.y),(p3.x-p1.x));
if (r1 > 0 && r2 < 0) {
if (r1-PI < r2)
return 1;
else
return -1;
} else if (r1 < 0 && r2 > 0) {
if (r1+PI < r2)
return 1;
else
return -1;
}
if (r1 > r2)
return 1;
return -1;
}
///////////////////////////////////////////////
// 左クリック処理
///////////////////////////////////////////////
int isLeftDown()
{
static int flag = 0;
if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
return 1;
return 0;
/*
//クリックした時のみ更新
if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
if (flag == 0) {
flag = 1;
return 1;
} else {
return 0;
}
}
flag = 0;
return 0;
*/
}
///////////////////////////////////////////////
// 右クリック処理
///////////////////////////////////////////////
int isRightDown()
{
static int flag = 0;
if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0)
return 1;
return 0;
/*
//クリックした時のみ更新
if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0) {
if (flag == 0) {
flag = 1;
return 1;
} else {
return 0;
}
}
flag = 0;
return 0;
*/
}