/***************************/
/* 三角形を表示する(2) */
/***************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char buf[25][80]; // 25x80文字分の配列
void Gen_line(int,int,int,int); // 線分生成
void main( )
{
int x1= 5,y1= 0; // 頂点1
int x2=25,y2= 0; // 頂点2
int x3=30,y3=10; // 頂点3
int y;
memset(&buf[0][0],' ',25*80); // 配列を空白で初期化
//--線分プロット--
Gen_line(x1,y1,x2,y2); // 線分生成
Gen_line(x2,y2,x3,y3); // 線分生成
Gen_line(x3,y3,x1,y1); // 線分生成
//--表示--
for( y=24; y>=0; y-- )
{ printf("%.80s",&buf[y][0]); } // 画面1行表示
fflush(stdout);
}
void Gen_line(
/*------------*/
/* 線分生成 */
/*------------*/
int xS, // 始点
int yS,
int xE, // 終点
int yE)
{
double dx,dy,a=0,b=0;
int x,y,yO,yN;
buf[yS][xS]='*'; // 始点
buf[yE][xE]='*'; // 終点
if ( xS==xE ) // 垂直線
{
if ( yS>yE ) { y=yS; yS=yE; yE=y; }
for( y=yS+1; y<yE; y++ ) buf[y][xS]='*'; // 線分上の点
}
else
{
if ( xS>xE )
{ x=xS; xS=xE; xE=x; y=yS; yS=yE; yE=y; } // 始点終点入れ替え
dx=xE-xS; dy=yE-yS;
a=dy/dx; b=yS-a*xS; // 直線の係数
if ( a>=-1.0 && a<=1.0 ) // 傾きが小さい
{
for( x=xS+1; x<xE; x++ ) // 線分補完
{
y=a*x+b+0.5; // 計算結果は四捨五入
buf[y][x]='*';
}
}
else if ( a>=0 ) // 傾きが大きくプラス
{
for( x=xS+1,yO=yS; x<=xE; x++,yO=yN ) // 線分補完
{
yN=a*x+b+0.5;
for( y=yO+1; y<=yN; y++ ) buf[y][x]='*';
}
}
else // 傾きが大きくマイナス
{
for( x=xS+1,yO=yS; x<=xE; x++,yO=yN ) // 線分補完
{
yN=a*x+b+0.5;
for( y=yO-1; y>=yN; y-- ) buf[y][x]='*';
}
}
}
}
|