資料 プログラムソース コmam.C
message(450,52,630,70,LIGHTRED,8,BLACK, (左
ボタン→決定) );
mainrnenu−100p:
clearmmouse−buttonO;
get.mollseLposition(&x,&y);
1x=(int)x/58;
rnouse−offO;
rnessage(450,4,500,22,LIGHTCYAN,2,BLACK,b ottom7crm d[tx]);
message(lx*58+6,4,lx*58+54,22,RED,4,WHIT E,bottom−crnmd[lx]);
rnouse−on O ; do{
get−rnouse−position(&x,&y)l if(mouse−left−buttonO==CLICK){
rnouse..offOl
message(lx*58+6,4,lx*58+54,22.YE LLOW,4,BLACK,bottorn−crnmd[lx]);
rnouse−on O ; switch(lx){
case O: draw−menuOi break;
case 1: cancel menu O; break;
case 2: rneasure rnenu O ;break;
case 3: transforrnO;
break;
case 4: fileLmenuO;
break;
case 5: step−doO;
break;
case 6: endO; brea kl
} }
/* if(rnouse−right−buttonO==CLICK){
mouse−of f O ;
message(lx*58+6,4,lx*58+54,2 2]YELLOW,4,BLACK,bottorn−cmmd[lx]);
1x=6;
message(450,4,500,22,LIGHTCY AN,2,BLACK,bottorn−crnmd[lx]);
flarne(450,28,630,46,LIGHTRED,
1);
endO;
} */
}while(lx==(int)x/58);
mouse−off O ;
message(450,4,500,22,LIGHTCYAN,2,BLACK,b ottorn−crnrnd[lx]);
rnessage(lx*58+6,4,lx*58+54,22,YELLOW,4,B LACK,bottom−cmrnd[lx]);
mouse−on O ; goto ma inrnenu.loop;
}
/**********************************************/
.f* 終了 */
/**********************************************!
void endO
{
int i;
unsigned flg;
void far *ground−data;
piO;
mouse offO;
message(450,28,630,46,LIGHTRED,8,BLACK, 作図
中の図形は消減 );
rnessage(450,52,630,70,LIGHTRED,8,BLACK, sよろ
しいですか? ):
ground−data=getTwindow(4g,139,353,238);
flarne(50,140,350,235,LIGHTRED,2);
rnouse−window(50,140,350,235);
mouse−finger−csr(275,215);
setcolor(BLACK);
outtextxy(60,150, 警告!! 作図中の図形は 消滅します );
outtextxy(60,190, (左ボタンで「終了」、右ボタンでメ ニューに戻る〉 );
flg=kakunin(270,210);
mouse−off O ;
put−window(4g,139,ground−data);
if (flg) { chousa O ;
rirekt touroku(END);
keika.fileO;
rireki−writeOi setactivepage( {AIN) ; setviewport(O,O,399,639,1);
window(1,1,80,25);
cleardeviceOi clrscrO;
setvisualpage(MAIN);
closegraphO;
exit(1);
} else {
clear.rnessageO;
ma in−menu O ; }
}
/**********************************************/
/* タイトルの表示 */
!**********************************************1
void titleO
{
int fl[]={140, 50,14e,230,144,225,144, 55,48 5, 55,490, 50,140, 50};
int kurni,ban,bot;
cleardeviceO;
setcolor(WHITE);
setfillstyle(SOLID−FILL,WHITE);
bar3d(O,O,639,39g,O,O);
setlinestyle(SOLID−LINE,O,NORM−WIDTH);
setcolor(BLACK);
setfillstyle(SOLID−PILL,DARKGRAY);
bar(140, 50,490,230)l
setfillstyle(SOLID−FILL,RED);
bar(145, 55,485,225);
setfillstyle(SOLID−FILL,RED+8);
fillpoly(7,fl);
setcolor(RED);
正ine(140, 50,145, 55>;
1ine(486,226,490,23e);
setcolor(WHITE);
settextstyle(O,O,1);
outtextxy(150,60, 「平面図形の性質探求」
ソフトウェア );
settextstyle(O,O,4);
setcolor(BLACK);
outtextxy(189.,90, 幾何ん坊 );
outtextxy(187,88, 幾何ん坊 );
setcolor(WHITE);
outtextxy(185,86, 幾何ん坊 );
outtextxy(183,84, 幾何ん坊 );.
settextstyte(e,O,1);
outtextxy(150,180, V e r.1.0 (履歴記.録 版1994/7/10) );
outtextxy(150,200, 【開 発】京都府立桃山高
等学校 大西俊弘 〉;
flame(100,250,540,340,LIGHTCYAN,3);
message(120,260,540,280,LIGHTCYAN,8,BLACK,
一 謝辞 一 );
資料 プログラムソース main. c
message(120,285,540,305,LIGETCYAN,8,BLACK,
本プログラムは、澤田憲一氏が開発された『幾何学者』
fe j ;
rnessage(120,315,540,335,LIGHTCYAN,8,BLACK,
のソースコードの一部を、許諾を得て使用しています。
tl j ;
kumi−input:
kumi=suuti−input(500,50,&bot,4);
ban =suuti.input(500,50,&bot,5);
if (bot==R) goto kumiminput;
user nurn=kurn i*100+ban;
}
ノ**********************************************/
/* 学習状況の調査(アンケート) *ノ
/**********************************************f
void chousaO
{
int n,bot;
piO;
mouse−off O ;
clrscrO;
setvisualpage(SUB)i setactivepage(SUB)i
setfillstyle(SOLID−FILL,LIGHTGRAY);
bar3d(O,O,639,399,0,0);
flarne(20,150,400,380,YELLOW.3);
textcolor(BLACK);
flarne(50,2e,500,40,LIGHTCYAN,3);
message(50,20,500,40,LIGHTCYAN.8,BLACK, 今日 の学習に対する感想をきかせて下さい 【問1】 );
gotoxy(5,12);cprintf( 図形の性質調べにどのよ うに取り組みましたか? );
gotoxy(7,14);cprintf( 1.とても積極的に取り
組んだ );
gotoxy(7,16);cprintf( 2.ごく普通に取り組ん
だ ):
gotoxy(7,18);cprintf( 3.あまり積極的には取
り組めなかった );
henji[O]=suuti−input(410,150,&bot,6);
clrscrO;
message(50,20,500,40,LIGHTCYAN,8,BLACK, 今日 の学習に対する感想をきかせて下さい 【問2】 ):
gotoxy(5,12);cprintf( 図形の性質を調べるのに 時間は十分でしたか? );
gotoxy(7,14);cprintf〔 1,時間が余った );
gotoxy(7,16);cprintf( 2.ちょうど時間内に終
ることができた );
gotoxy(7,18);cprintf( 3.時間が不足した );
henji[1]一suutiminput(410,150,&bot,6);
clrscrO;
message(50,20,5aO,4e,LIGHTCYAN,8,BLACK, 今日 の学習に対する感想をきかせて下さい 【間3】 );
gotoxy(5,12);cprintf( 図形の性質を幾つ見つけ ることができましたか );
gotoxy(7,14);cprintf( 1.3個以上 );
gotoxy(7,16);cprintf( 2.1〜2個 );
gotoxy(7,18);cprintf( 3.見つけることができ
なかった );
henji[2コ=suuti_inPut(410,150,&bot,6);
clrscrO;
rnessage(50,20,500,40,LIGHTCYAN,8,BLACK, 今日 の学習に対する感想をきかせて下さい 【問4】 );
gotoxy(5,12);cprintf( 今日の学習は、興味深か
ったですか? );
gotoxy(7,14);cprintf( 1 . 1−tV );
gotoxy(7,16);cprintf( 2,どちらでもない );
gotoxy(7,18);cprintf( 3.いいえ );
henji[3]=suuti.input(410,150,&bot,6);
}
170 一
資料 プログラムソース
tool.c
#include <stdarg。h>
#include <stdio.h>
#include <conio.h>
#include 〈alloc.h>
#include 〈math.h>
#include <graphics.h>
#include <dos.h>
#include <pc98.h>
#include 〈string.h>
#include geo.h
struct clockinfo timf;
#define BCDtot(x) ((xf16)*10+(x%16))
#define BUFSIZE 40 extern double px[52],py[52];
extern extern extern extern extern
lnt job−nuva;
int job[50];
int cp−num;
int ip.nurn;
int pmnurn[100];
extern char p−label[100]
extern int rnenu inf[][2]
extern char *job−cmmd[48];
extern char *msg[34];
extern char *point−labe1[52];
extern struct ver hen[100];
extern struct ang kaku[100コ;
extern int h nurn;
extern int k nurn;
extern int rec.num;
extern struct rireki rec[500];
extern struct time j ikan;
extern struct date hiduke;
f*********************************************/
/* 警告音を出す */
/*********************************************/
void noiseO
{
sound(3000);nosoundO;
}
/********************************************/
/* シフトキーの押下状態を検出 */
/********************************************!
unsigned shiftfikey−scanO
{
unsigned sft;
sft=pc98key(2);
return sft;
}
f********************************************/
/* CAPSキーの押下状態を検出 */
/********************************************/
uns igned caps−keyhscanO
{
unsigned caps;
caps=pc98key(2);
return caps;
}
/********************************************/
/* 文字列の入力窓 */
/********************************************/
void getstr(double x,double y,int text_cしchar*
str)
{
}
int ccount=O,xl,x2;
int cl=(getpixel(x,y));
mousepff O l setcolor(text−cl);
setfillstyle(SOLID−FILL,cl);
moveto(x,y);
do{
str[ccount]=getchO;
switch(str[ccountコ){
case BS:
ccount一一;
raoverel(一8,0);
x2=getxO+7i xl=getxO ; bar(xl,y,x2,y+15)l break;
case CR:
str[ccount]= ¥O ; break;
default:
str[++ccount]= ¥O ; outtextC&str[ccount−1]);
str[ccount]= a i break;
}
}while(str[ccountl!= ¥O );
/********************************************f
/* 確認ボタンの認識 */
/********************************************f
unsigned kakunin(double xl,double yl)
{
double x2=xl+62,y2=yl+18;
unsigned resulti piO;
mouse−window(xl,yl,x2,y2);
rnouse.finger−csr(xl+26,yl);
rnouseeoffO i
flame(xl,yl,x2,y2,WHITE,1);
rnessage(x1+1,y1+1,x2−1,y2−1,WHITE,8,BLACK,
確 認 );
mouse−on O ; result=O;
do{
if(mouse−right−buttonO==CLICK) resu lt=1;
if(mouse−left−buttonO==CLICK) resu
lt=2;
}while(result==O);
mouse−off O ;
rnessage(xl+1,yl+1,x2−1,y2−1,BLACK,8,WHITE,
確 認 );
rnoll$e on O ; return(result−1);
}
/ *********************************************f
/* マウスカーソルの座標を表示する */
!* x,y:カーソルの座標 */
f*********************************************/
void Position(double x,doub正e y)
{
textcolor(BLACK)i gotoxy(5g,7);
cprintf( X=%3d Y=%3d ,(int)x−4,368一((int)y+O FFSET−Y));
}
f*********************************************/
/* 新しくできた点の座標を登録し,記号を画面上
一 171 一
に表示する *
/
/*********************************************f
void save−cp(double x.double y)
{
setcolor(RED);
px[cp.num]=x;py[cp−num]=y;
setviewport(7,30,435,392,1);
outtextxy(x+DX,y+DY,point−label[cp=num]);
setviewport(O,O,639,399,1);
cp..num++1
}
/*********************************************/
./* 指示した点が何番目の点であるかと,
その記号を登録 *
/.
./*********************************************/
void save−iP(int p)
{
P_num[ip_num]冨P;
P_label[iP_nurn]=*Point_1abel[P];
サ ロ
lp_nu皿++,
}
/***************************************・******/
/*クリックした座標の近傍±5の既存の点の検索*/
/*********************************************/
int p−check(double x,double y)
{
ine n,p,r;
if(shtftmkey−scanO==1) r=O;
else r=5;
for(n;0;n<cp_num;n++){
if((x>=px[n]一r &&x<=px[n]+r) && (y>;py
[n]一r && y〈=py[n]+r)〉{
p=n;goto exit;
} } p=一t;
exit:
retllrn(p) ;
}
/**********************************************/
ノ* 角度の計算 */
/**********************************************/
double angle(double xl,double yl,double x2,doubl e y2,double x3,double y3)
{
double a,b,c,cos−b,theta;
c=sqrt((xl−x2)*(x!−x2)+(yl−y2)*(yl−y2));
a=sqrt((x3−x2)*(x3−x2)+(y3−y2)*(y3−y2));
b=sqrt((x3−xl)*(x3−xl)+(y3−yl)*(y3−yl));
if(a*c==O){
theta=O.O;
goto exit;
} else{
cos−b;(a*a+c*c−b*b)/(2*a*c);
theta=acos(cos−b)*180/3.141592653589 79324;
} exit:
return(theta);
}
!**********************************************/
./* 距離の計算 */
f**********************************************/
172
資料 プログラムソース
tool.c
double distance(double xl,double yl,double x2,do uble y2)
{
return(sqrt((xl−x2)*(xl−x2)+(yl−y2)*(yl−y2)))
;
}
/**********************************************!
/* 面積の計算 */
/ **********************************************/
doilble area(double xl,double yl,double x2,double y2,double x3,double y3)
{
double s,a,b,c;
a;sqrt((xl−x2)*(xl−x2)+(yl−y2)*(yl−y2));
b=sqrt((x2−x3)*(x2−x3)+(y2−y3)*(y2−y3));
c=sqrt((xl−x3)*(xl−x3)+(yl−y3)*(yl−y3));
s=a+b+c;
return((sqrt(s*(s−2*a)*(s−2*b)*(s−2*c)))/4);
}
/*********************************************/
/* 格子点 *./.
/*********************************************/
void gridO
{
in七i,j;
for =14;i〈=438;i=i+10){
for(j=38;j〈394;j=j+10){
putpixe1G,j,RED);
} }
}
/**********************************************/
/* 点を小円で表示する */
f**********************************************f
void pset(double x,double y,int cl)
{
int present−color=getcolorO;
setviewport(7,30,435,392,1);
setcolor(cl);
putpixel((int)x+DX,(int)y+DY,cl);
circle((int)x+DX,(int)y+DY,2);
setviewport(O,O,639,399,1);
setcolor(present.color);
}
/**********************************************/
/* イメージデータの退避 */
./******継**************************************/
void far *get−window(int xl,int yl,int x2,int y2)
{
unsigned size;
void far *ground−data;
size=irnagesize(x1,y1,x2,y2);
ground−data=farmalloc(size);
getimage(xl,yl,x2,y2,ground−data);
return(groundTdata);
}
/**********************************************/
/* イメージデータの解放(元の画面に戻す)*
/
f**********************************************/
void put−window(int xl,int yl,void far *ground−d ata)
{
putimage(xl,yl,ground−data,COPY−PVT);
}
farfree (g round−data) ;
/**********************************************/
/* メニューの中心部分 *1
/**********************************************・!
int rnenu(int job−type , int xpos , int ypos)
{
double x,y;
int i,ly,ret;
void far *ground.data;
int menu−num=rnenu−inf[job−type] [O];
int i tem−nurn=menu−inf[job−type][1];
rnouseroff O ;
ground.data;getHwindow(xpos−1,ypos−1,xpos+11 3,ypos+item−num*20+9);
flarne(xpos,ypos,xpos+110,ypos+3+item−num*20,
YELLOW,2);
mouse−window(xpos,ypos+5,xpos+120,ypos+3+ite
rn.nurn*20) ;
mouse−finger=csr(xpos+50,ypes+23);
setcolor(BLACK);
for(i=O;i〈item−num;i++)
ollttextxy(xpos+8,ypos+4+20*i,job一.cmmd[menu−n um+i]);
mouse−onO ; piO;
do{
get一.rnouse−position(&x,&y);
(int)ly=(y−ypos−5)/20;
rnouse−off O ;
message(510,4,630,22,LIGHTCYAN.8,BLACK,j ob−crnrnd[menu−num+ 1y] ) l
highlightbar(xpos,ypos+3+20*ly,xpos+110,
ypos+20*ly+23,RED,WHITE,job−cmmd[rnenu.num+ly]);
mouse−on O ; do{
get−rnouse−position(&x,&y);
}wh i le(ly==(((int)y−ypos−5)/20) && rnouse
−left.buttonO1=CLICK && rnouse−right−buttonO!=C LICK);
rnouse−off O ;
highlightbar(xpos,ypos+3+20*ty,xpos+110,
ypos+20*ly+23,YELLOW,BLACK,job cmmd[menu−nurn+ly])
;
rnouse−on O ;
}while(rnouse−left−buttonO!=CLICK && rnouse−r ight−butten O !=CLICK) ;
if(rnouse−right−buttonO==CLICK){
mouse offOi
flame(510,4,630,22,LIGHTCYAN,1);
put window(xpos−1,ypos−1,ground−data)
;
rnouse on O l ret・0了 }
if(mouse−left−buttonOn=CLICK){
rnouse−offO;
message(510,4,630,22,LIGHTCYAN,8,BLA CK,job−cmrnd[rnenu−num+ly]);
put−window(xpos−1,ypos−1,ground−data)
;
mouse.on O i ret=ly+1;
} return(ret);
}
/**********************************************/
/.* メッセージ用の枠の表示 */.
f**********************************************./
173
資料 プログラムソース tool. c
void flarne(int xl, int yl, int x2, int y2, int c 1,int d)
{
int c=getcolorO;
setlinestyle(O,O,3);
setcelor(BLACK);
setfillstyle(SOLID.FILL,BLACK);
bar3d(xl+d,yl+d,x2+d,y2+d,O,O)i bar3d(xl,yl,x2,y2,0,0);
setcolor(cl);
setfillstyle(SOLID−FILL,cl);
bar3d(xl+1,yl+1,x2−1,y2−1,0,0)l setcolor(c);
setlinestyle(O,O,1);
}
/**********************************************f
./* メッセージの表示 *./.
f**********************************************!
void rnessage(int xl,int yl,int x2,int y2,int gTc 1,int d,int tLcl,char *msg)
{
setlinestyle(SOLID−LINE,O,THICK−WIDTH);
setcolor(g−cl);
setfillstyle(SOLID−FILL,g−cl);
bar3d(xl+1,yl+1,x2−1,y2−1,0,0);
setcolor(t−cl);
outtextxy(xl+d,yl+1,rnsg);
setlinestyle(SOLID−LINE,O,NORN−WIDTH);
}
/**********************************************/
!.* ハイライトバーの表示 *ノ
/**********************************************/
void high工ightbar(int x正,int yl,int x2,int y2,in t g−cl,int t−cl,char *rnsg)
{
setcolor(g−cl);
setfillstyle(SOLID−FILL,g−cl)l bar3d(xl,yl−1,x2,y2−1,0,0);
setcolor(t.c1);
outtextxy(xl+8,y1+1,msg);
}
・/**********************************************/
/* マークを付ける *./.
/**********************************************/
void rnark(int x,int y,int c)
{
int f1[8コ;
int cl=getcolorO;
fl[e]一x; fl[1]=y+1;
f1[2]=x+10; f1[3]=y+7;
fl [4] =x; fl [5]=y+ 13;
fl[6]=x; fl[7]=y+1;
setcolor(BLACK);
setfillstyle(SOLID−FILL,c);
fillpoly(4,fl);
drawpoly(4,f1);
1ine(x+10,y+8,x,y+14)i setcolor(cl);
}
f**********************************************/
./* グラフィック画面への書式付き出力 *./
f**********************************************/
int gprintfxy(int x, int y,char *fmt,...)
{
va−list argptr;
char str[BUFSIZE];
資料 プログラムソース
tool.c
}
int cnt;
va−start(argptr,frnt) ; cnt=vsprintf(str,fmt,argptr);
outtextxy(x,y,str);
vaTend(argptr);
ret rn(cfi t) ;
/・**********************************************/
/* 回転後の座標の計算 */
/**********************************************f
void rotation(double xl.double yl,double x2,doub le y2,doubte t,double *x3,double *y3)
{
*x3=(x2−xl)*cosl(t)一(y2−yl)*sinl(t)+xl;
*y3=(x2−xl)*sinl(t)+(y2−yl)*cosl(t)+yl;
}
/**********************************************/
/* メッセージ枠をクリアする */
/**********************************************/
void clear−rnessageO
{
flame(510,4,630,22,LIGHTCYAN,1);
flame(450,28,630,46,LIGHTRED,1);
flarne(450,52,630,70,LIGHTRED,1);
mouse−onO ; clrscrO;
}
/**********************************************f
/* 三角形の形状情報を保存する */
/**********************************************/
void triminfo(int tl,int t2,int t3,int opt)
{
int k,tl,th;
/*1本目の辺*/
if (opt==SANKAKU) {
if (t1くt2) {t1=t1; th=t2;}
else {tl=t2; th=tl;}
hen[hmnum].pl=t1;
hen[h−num].p2=th;
hen[h−nurn].bai=1.0;
hen[h−num].kanke i=h−nurn;
h. nurn++i }
/*2本目の辺*/
if (t2くt3) {t1一七2; th;t3;}
else {tl=t3; th=t2;}
hen[h−num].pl=tl;
hen[hTnum].p2=th;
switch (opt) { case SEISANKAKU:
n[kユ.kanket;
num;
default:
k=hen−search(t1,t2);
hen[h_numユ.kankei=he break;
hen[h−num].kankei=h一
}
hen[h num].bai=1.0;
h nurn++;
/*3本目の辺*/
if 〔t1くt3) {tl=tl; th=t3;}
else {tl=t3; th=tl;}
hen[h_num].pl=七1;
hen[hTnum].p2=th;
switch (opt) { case SEISANKAKU二
k=hen−search(tl,t2);
hen[h−num].kankei=he 皿[k]曾kankei;
break;
case NITOUHEN:
hen [h−nurn] . kanke i=h−
num−1;
break;
case CHOKKAKUNITOUHEN:
hen [h.nurn] . kanke i=h−
num−1;
break;
default:
hen [h−nurn] . kanke i=h−
num;
}
hen[hptnurn].bai=1.0;
h num++;
1*1つ目の角*/
if (t1くt3) {t1=t1; th=t3;}
else {tl=t3; th=tl;}
kaku[k−num].pl=tll kaku[kmnum].p2=t2;
kaku[k−num].p3 th;
switch (opt) { case SEISANKAKU:
kaku [k.nurn] . kankei=一 60;
kaku [k−nurn] . deg=60 .0
break;
case CHOKKAKUNITOUHEN:
kaku[k−num].kankei=一 45;
kaku [kHnurn] . deg=45 .0
;
break;
default:
kaku[k−num].kankei=k rnurni
} knum++;
/*2つ目の角*/
if (tlくt2) {t1;t1: th=t2;}
else {tl;t2; th=tl;}
kaku[k−nurn].p1;t 1;
kaku[k−num].p2一一t3;
kaku[k−num].p3=th;
switch (opt) { case SEISANKAKU:
kaku [k−nurn] . kanke i=一 6e;
kaku[k−num].deg=60.0
break;
case CHeKKAKU:
kaku[k−num].kankei=n 90;
kaku[k−nurn].deg=90.0
;
break;
case CHOKKAKUNITOUHEN:
kaku[k−nurn].kankei=一 90;
kaku [k.nurn] . deg=90 . e
;
breakl defau/t:
kaku [k−num] ..kankei=k num;
} k num++;
/*3つ目の角*/
if (t2くt3) {tl=t2: th=t3;}
else {tl=t3; th=t2;}
一 174 一
資料 プログラムソース
tool.c
60;
;
kaku[k−num].pl=t1;
kaku[k−num].p2=tl;
kaku[k−nurn].p3=th;
switch (opt) { case SEISANKAKU:
nurn−2;
45;
;
一nurn;
} k. num++;
}
case NITOUHEN:
kaku [k−fium/ . kankei=一
kaku[k−nurn].deg=60.0
break;
kaku [k−nurn] . kankei =k
break;
case CHOKKAKUNITOUHEN:
kaku[k−nurn].kankei=一
default:
kaku[k−num].deg=45.0
break;
kaku [k−nurn] . kankei=k
/**********************************************f
/* 四角形の形状情報を保存する */
/**********************************************f
void quadminfo(int tl,int t2,int t3,int t4,int o
pt)
{
int t,tl,th,k;
/*1本目の辺*/
if (opt==SIKAKU) {
if (t1くt2) {t1=t1; th=t2:}
else {tl=t2; th=tl;}
hen[hLnurn].pl=tl;
hen[h−num].p2=th;
hen[hunurn].bai=1.Oi hen[hNnurn].kankei=h−num;
h num++;
}
/*2本目の辺*/
if (t2く七3) {tl=t2; th=t3;}
else {tl=t3; th=t2;}
hen[h−num].pl=tl;
hen[h−num].p2=th;
switch (opt) { case SEIHOUKEI:
k=hen−search(tl,t2);
hen[hunurn].kanke i=he n[kユ.kankei;
break;
case HISIGATA:
k=hen−search(tl,t2);
hen[h_nu皿ユ.kanke i=he n[k].kankei;
break;
default:
hen[h」】umユ.kanke i=h_
nurn;
}
hen[h−num].bai=1.0;
h num++;
/*3本目の辺*/
if (t3くt4) {tl=t3; th=t4;}
else {tl=t4; th=t3;}
hen[h−nurn].pl=tl;
hen[h−nurn].p2=th;
switch (opt) { case SEIHOUKEI:
k=hen−search(t1,t2);
hen[hmnum].kankei=he n[k].kankei;
break;
case HISIGATA:
k=hen−search(tl,t2);
hen [hrmnum] . kanke i=he n[k].kankeil
break;
case CliOUHOUKE!:
k=hen−search(t1,t2);
hen[h.num].kankei=he n[k].kankei;
break;
case HEIKOUSIHENKEI:
k=hen−search(tl,t2);
hen[h−num].kankei=he n[k].kankei;
break;
default:
hen[h−num].kankei;h−
nurn;
}
hen[h.num].bai=1.0;
h num++;
/*4本目の辺*/
if (tlくt4) {t1=t1; th=t4;}
else {tl=t4; th=tll}
hen[h.nurn].pl=tl;
hen [hrr num] .p2=th ; switch (opt) { case SEIHOUKEI:
k=hen−search(t1,t2)i hen [h−nuni] . kanke i=he n[k].kankei;
break;
case HISIGATA二
k=hen−search(tl,t2)i hen[h−num].kankei=he n[k].kankei;
break;
case CHOUHOUKEI:
k=hen−searchCt2,t3)i hen[h_numコ.kankei=he n[k].kankei;
break;
case HEIKOUSIHENKEI:
k=hen.search(t2,t3);
hen[h_numコ.kankei=he n[k].kankei;
break;
default:
hen[h_nu皿コ.kankei=h_
num;
}
hen[hJnum].bai=1.0;
h nurn++;
/*1つ目の角*/
if (t1くt3) {tL=t1; th=t3;}
else {tl=t3; th=tl;}
kaku[k−num].p1=tli kaku [k−nurn] . p2=t2 ; kaku[k−num].p3=th;
switch (opt) { case SEIHOUKEI:
kaku[k−nurn] .kankei=一
901
kaku [k.nurn] . deg=90 .0
;
break;
case CHOUHOUKEI:
kaku[k−nurn].kankei=一 90;
kaku[k−num].deg=90.0
一 175 一
資料 プログラムソース tool. c
;
break;
default:
kaku [kmnurn] . kankei=k
.num;
} k num++;
/*2つ目の角*/
if (t2くt4) {七1=t2; th=t4;}
else {tl=t4; th=t2;}
kaku[k−num].pl=tl;
kaku[k−num].p2=t3;
kaku[knurn].p3=th;
switch (opt) { case SEIHOUKEI:
kaku[k−num].kankei=一 ge;
kaku[k−nurnコ.deg=90.0
;
break;
case CHOUHOUKE I:
kaku[k−num].kankei=一 90;
kaku[kunurn].deg=90.0
break;
default:
kaku[kTnurn] . kankei=k
−nurai } k num++;
/*3つ目の角*/
if (t1くt3) {tl=tl; th=t3;}
else {tl=t31 th=tll}
kaku[k_numコ.pl=tl;
kaku[k−nura] . p2=t4;
kaku[k.nurn].p3=th;
switch (opt) { case SEIHOUKEI:
kaku [k−nurn] . kankei=一 go;
kaku[k−num].deg=90.0
;
breaki case CHOUHOUKEI:
kaku[k−nurn].kankei=一 go;
kaku[k−nurn].deg=90.0
;
break;
case HISIGATA:
kaku[k.num].kankei=k num−2;
break;
case HEIKOUStHENKEI:
kaku[kunum].kankei=k num−2;
break;
default:
kaku[k−num].kankei=k
−numi } k nurn++;
901
/*4っ目の角*/
if (t2〈t4) {tl=t2;
else {tt=t4;
kaku[k−num].p1=t1;
kaku[k−num].p2=tl;
kaku[k−num].p3=th;
switch (opt) {
th=t4;}
th=t2;}
case SEIHOUKEI:
kaku[k_numユ.kankei=一
kakuこk_numユ.deg=90.0
90;
nurn−2;
num−2;
u.num;
} k num++;
}
case CHOUHOUKEI:
case HISIGATA:
break;
kaku[k. num].kankei=一
kaku[k−nllm].deg一一gO.O
break;
kaku[k.nurn].kankei=k
break;
case HEIKOUSIHENKEI:
kaku[k_numユ.kankei=k
default:
break;
kaku [k−nurn] . kankei=k
!・**********************************************/
/* 2つの点の番号から辺の番号を取り出す */
/**********************************************/
int henLsearch(int tl,int t2)
{
int i,t;
int ret=一1;
if (tl>t2) {t=tli tl=t2; t2=t;}
for (i;0;iく=h nurn:i十十) {
if ((hen[iコ.pl==tl)&&(hen[iコ.p2=;t2))
{
ret=i;
break;
} }
return (ret);
}
/**********************************************/
/* 3つの点の番号から角の値を取り出す */
/**********************************************/
double kaku−search(int tl,int t2,int t3)
{
int i,t;
double rp=O.O;
if (tl>t3) {t=tl; tl=t3; t3−t;}
for (i=0:iく=k num:i++) {
if ((kaku[i].pl==tl)&&(kaku[i].p2==t 2)&&(kaku[i].p3==t3)) {
rp=kaku[i].deg;
break;
} } return (rp);
}
!**********************************************/
/* 座標を与えて最も近い点の番号を取り出す */
1**********************************************/
int point−search(double xl,double yl)
{
int ii int rp=一1;
for (i=O;iくcp_num;i++) {
if ((fabs(px[i]一x1)く2) && (fabs(py[i]一 y1)く2)) {
rp=i;
break;
r 176 一
資料 プログラムソース too 1. c
}
} return (rp);
}
f**********************************************/
/* 整数値の入力 */
/・**********************************************/
int suuti−input(int xpes,int ypes,int *bot,int o
pt)
{
int i,j,cしsuuti,n=0:
dQuble x,y;
char kyi ¥O , a[10];
char flg= ; void far *groundptdata;
*bot=L;
mouse offOl cl=getcolorO;
mou$e−window(xpos,ypos+60,xpos+130,ypos+135)
;
ground−data=get−wi ndow(xpos−1,ypos−1,xpos+13 3,ypos+138);
flame(xpos,ypos,xpos+13e,ypos+135,LIGHTGREEN,
2)i
flame(xpos+5,ypos+35,xpos+35,ypos+55,BLACK,O)
;
setcolor(BLACK);
for(i;1;iく=5;i++){
for(j;1;jく=2;j++){
setfillstyle(SOLIDrmFILL,BLAC K);
bar3d(xpos+(i−1)*25+6,ypos+
(j−1)*25+61,xpos+(i−1)*25+26,ypos+(j−1)*25+81,0,
o);
setfillstyle(SOLIDTFILL,WHIT
E);
bar3d(xpos+(i−1)*25+5,ypos+
(j−1)*25+60,xpos+(i−1)*25+25,ypos+Cj−1)*25+80,0,
o);
} }
setfillstyle(SOLI]一FILL,BLACK);
bar3d(xpes+6 ,ypos+111,xpos+51 ,ypos+131,0,0)
;
bar3d(xpos+56,ypos+111,xpos+126,ypos+131,0,0)
;
setfillstyle(SOLID−FILL,YELLOW);
bar3d(xpos+5 ,ypos+110,xpos+50 ,ypos+130,0,0)
;
bar3d(xpos+55,ypostllO,xpos+125,yp6s+130,0,0)
;
setcolor(BLACK);
outtextxy(xpos+ 7 ,ypos+62, 1 );
out textxy(xpOs+32 ,ypos+62, 2 );
outtextxy(xpos+57 ,ypos+62, 3 );
ottttextxy(xpos+82 ,ypos+62, 4 );
outtextxy (xpos+107,ypos+62, 5 );
outtextxy(xpos+ 7 ,ypos+87, 6 );
outtextxy(xpos+32 ,ypos+87, 7 );
outtextxy(xpos+57 ,ypos+87, 8 );
outtextxy(xpos+82 ,ypos+87, 9 );
out textxy (xpos+107 ,ypos+87, O ) ; outtextxy(xpos+7,ypos+112, 訂正 );
outtextxy(xpos+57,ypos+112, 入力終了 );
switch (opt){
case 1:
outtextxy(xpos+5,ypos+10, 何等分し
ますか );
outtextxy(xpos+36,ypos+37, 等分 (n
)2) );
break;
case 2:
ou七textxy(xpos+5,ypos+10, 何番目の
点ですか );
outtextxy(xpos+36,ypos+37, 番目 (m
=〉. 1) );
break;
case 3:
outtextxy〔xpos+5,ypos+10, 何角形で すか? );
outtextxy(xpos+36,ypos+37, 角形(5〜
18) ) ;
break;
case 4:
outtextxy(xpos+5.ypos+10, 何組です か? );
outtextxy(xpos+36,ypos+37, 組(1〜
20) )l break;
case 5:
outtextxy(xpos+5,ypos+10, 何番です か? );
outtextxy(xpos+36,ypos+37, 番(1〜
50) ) ;
break;
case 6:
outtextxy(xpos+5,ypos+10, 何番です か? );
outtextxy(xpos+36,ypos+37,t 番 (1〜
3) ) ;.
break;
} rnouse−on O ;
mouse−fingerTcsr(xpos+55,ypos+80);
setcolor(WHITE)i input:
do{
piO;
do{
get−mouse−position(&x,&y)l if(rnouse−rightmbuttonO==CLICK)
{
*bot=R;
goto exit;
}
}white (mouse left−buttonO!=CLICK);
if ((y>ypos+60 && y<ypoS+80) && (x
>xpos+5 &&x<xpos+25 )) {ky= 1 ;}
else if((y>ypos+60 && y〈ypos+80) && (x
>xpos+3G&&x<xpos+50 )) {ky=,2,;}
else i f((y>ypos+60 && y<ypos+80) && (x
>xpos+55 && x<xPos+75 )) {ky= 3 ;}
else if((y>ypos+60 && y〈ypos+80) && (x
>xpGs+80 && x<xpos+100)) {ky= 4 ;}
else if((y>ypos+60 && y<ypOs+80) && (x
>xpos+105.&& xくxpos+125)) {ky= 5 ;}
else if((y>ypos+85 && y<ypos+正05) &&
(x>xpos+5 && x〈xpos+25)) {ky;,6,;}
e且se if((y>ypos+85 && y<ypos+105) &&
(x>xpos+30 && x<xpos+50)) {ky= 7 ;}
else if((y>ypos+85 && y<ypos+105) &&
(x>xpQs+55 && x<xpos+75)) {ky; 8 ;}
else if((y>ypos+85 &&y<ypos+105) &&
(x>xpos+80 && x<xpos+100)) {ky= 9 ;}
else if((y>ypos+85 && y〈ypos+105) &&
(x>xpos+le5 && x〈xpos+125)) {ky± O ;}
else if((y>ypos+110 && y〈ypos+130) &&
(x>xpos+5 && x〈xpos+50 )) {flg= a ;ky= ¥O ;}
else if((y>ypos+110 && y<ypos+130) &&
(x>xpos+55 && xくxpos+125)) {flg; r ;ky= ¥O ;}
else { noiseO;
goto inputi