HSP | 線分ではなく直線を描画する (自動的に画面の端まで線を引く) モジュール | 修正版

HSP | 線分ではなく直線を描画する (自動的に画面の端まで線を引く) モジュール | 修正版

以前作ったヤツはその記事にも書いてあるように余分な数値が出たりしていましたが今度はちゃんとしたので行けます。

#module "kerupanium"
////////////////////////////////////////////////
// 直線・半直線描画モジュール by kerupani129  //
// ■使い方■                                 //
// このソースを自分のプログラムの一番最初に   //
// 張り付けることで、、line2,line3,line4,     //
// line5命令を使用できるようになります。      //
// 以下のソースの各命令の所に使い方が書いて   //
// あります。                                 //
// ■やってはだめなこと■                     //
// 画面内の端まで引くように作ったプログラム   //
// なので画面外の座標を指定するとバグります。 //
////////////////////////////////////////////////
//-------- 座標を算出するメインの処理 --------//
#deffunc local calculation int _p1,int _p2,double _p3,array _p4
// 準備
p1=0.0+_p1
p2=0.0+_p2
p3=_p3\(M_PI*2)
ginfo12=0.0+ginfo(12)
ginfo13=0.0+ginfo(13)
// 最初に式
n(0)=(atan(ginfo13-p2,ginfo12-p1)+M_PI*2)\(M_PI*2)
n(1)=(atan(ginfo13-p2,-p1)+M_PI*2)\(M_PI*2)
n(2)=(atan(-p2,-p1)+M_PI*2)\(M_PI*2)
n(3)=(atan(-p2,ginfo12-p1)+M_PI*2)\(M_PI*2)
o(0)=0.0
o(1)=M_PI/2
o(2)=M_PI
o(3)=M_PI*3/2
o(4)=M_PI*2 // o(0) と等しい
// 場合分け
if (n(3)<=p3 & p3<o(4)) | (o(0)<p3 & p3<n(0)) : _p4=ginfo12,p2+(ginfo12-p1)*tan(p3)
if p3=o(0) : _p4=ginfo12,p2
if (n(0)<=p3 & p3<o(1)) | (o(1)<p3 & p3<n(1)) : _p4=p1+(ginfo13-p2)/tan(p3),ginfo13
if p3=o(1) : _p4=p1,ginfo13
if (n(1)<=p3 & p3<o(2)) | (o(2)<p3 & p3<n(2)) : _p4=0.0,p2-p1*tan(p3)
if p3=o(2) : _p4=0.0,p2
if (n(2)<=p3 & p3<o(3)) | (o(3)<p3 & p3<n(3)) : _p4=p1-p2/tan(p3),0.0
if p3=o(3) : _p4=p1,0.0
return
//--------- 半直線を引くメインの処理 ---------//
#deffunc local m_line2 int _p1,int _p2,double _p3
// 準備
p1=0.0+_p1
p2=0.0+_p2
p3=_p3\(M_PI*2)
// 算出
calculation@kerupanium p1,p2,p3,p
// 描画
line p1,p2,p(0),p(1)
return
//---------- 直線を引くメインの処理 ----------//
#deffunc local m_line3 int _p1,int _p2,double _p3
// 準備
p1=0.0+_p1
p2=0.0+_p2
p3=_p3\(M_PI*2)
// 算出
calculation@kerupanium p1,p2,p3,p
calculation@kerupanium p1,p2,p3+M_PI,t
// 描画
line p(0),p(1),t(0),t(1)
return
//--------------- 命令割り当て ---------------//
#define global line2(%1=0,%2=0,%3=0.0) m_line2@kerupanium %1,%2,%3
////////////////////////////////
// 半直線描画                 //
// line2 p1,p2,p3             //
// p1 : ラインの始点X座標     //
// p2 : ラインの始点Y座標     //
// p3 : 角度値(ラジアン)      //
////////////////////////////////
#define global line3(%1=0,%2=0,%3=0.0) m_line3@kerupanium %1,%2,%3
////////////////////////////////
// 直線描画                   //
// line3 p1,p2,p3             //
// p1 : ラインの通る点のX座標 //
// p2 : ラインの通る点のY座標 //
// p3 : 角度値(ラジアン)      //
////////////////////////////////
#define global line4(%1=0,%2=0,%3=0,%4=0) m_line2@kerupanium %1,%2,atan(%4-%2,%3-%1)
////////////////////////////////
// 半直線描画                 //
// line4 p1,p2,p3,p4          //
// p1 : ラインの始点X座標     //
// p2 : ラインの始点Y座標     //
// p3 : ラインの通る点のX座標 //
// p4 : ラインの通る点のY座標 //
////////////////////////////////
#define global line5(%1=0,%2=0,%3=0,%4=0) m_line3@kerupanium %1,%2,atan(%4-%2,%3-%1)
////////////////////////////////
// 直線描画                   //
// line5 p1,p2,p3,p4          //
// p1 : ラインの通る点のX座標 //
// p2 : ラインの通る点のY座標 //
// p3 : ラインの通る点のX座標 //
// p4 : ラインの通る点のY座標 //
////////////////////////////////
#global

今度は場合分けを厳密に (?) したので画面外の数値が出ることはない (はず) です。
ソース内の注意書きにもあるように、画面外の座標を指定してはいけません。なぜかというと、場合分けの時に、角度が●~●の時、角度が●~●の時…とやっているのですが、角度の大小関係が変わってしまうためにうまく判断できないからです。そこまで対応させたほうがいいのかもしれませんが、画面外は普通は描かないわけで、特に必要ないかと思ってこのままにしました。
↓クリックしてくれたらうれしいです~。