HSP | 線分ではなく直線を描画

HSP | 線分ではなく直線を描画

昔っから考えていたのを思い出して作成、
直線といっても、無限の長さを描画するのは無理なので、ウィンドウ内の端から端まで行くような線分のことを言っています。
最近はなんかちゃんとしたゲームとかじゃなくこういうのしか作れてない…。っていうかそもそもHSPに触れる回数が減ってしまった…。

// モジュール
#module "kerupanium"
#deffunc line2 int _p1,int _p2,double _p3
/*
line2命令 : 線分ではなく直線を描画
_p1 : X座標 、_p2 : Y座標 、_p3 : 角度値(ラジアン)
指定したX,Y座標を通る角度_p3の直線を描画
*/
switch tan(_p3)
case 0.0
x1=0
y1=_p2
x2=640
y2=_p2
swbreak
default
if _p3<atan(_p1,_p2) {
x1=double(_p1)-double(_p2)/tan(_p3)
y1=0
} else {
x1=0
y1=double(_p2)-double(_p1)*tan(_p3)
}
if _p3<atan(640-_p1,480-_p2) {
x2=double(_p1)+(480.0-double(_p2))/tan(_p3)
y2=480
} else {
x2=640
y2=double(_p2)+(640.0-double(_p1))*tan(_p3)
}
swbreak
swend
line x1,y1,x2,y2
return
#global
// サンプル
s2=0.0
*main
redraw 0
color : boxf
a1=191
a2+ : a2\191
b1=255
s1=0.0
s2+0.02
x1=320
y1=240
repeat 50
hsvcolor a1+a2,255,b1 : line2 x1,y1,s1+s2
s1-0.05
a1- : a1\382
b1-10 : if b1<0 : b1=0
x1-8
y1+6
loop
redraw
await 15
goto *main

まず、角度が0だと、18行目や25行目の所でエラーが出て落ちるので、タンジェント値が0の時は指定したY座標のやつで真横に線を引きます。それ以外の時は、左上と右下が角よりどっち側にあるか条件判断して座標出して線を引きます。(なので、見た目は問題ないですけど左下と右上の線が引かれるときは余分な数値が出ています。まあHSPはウィンドウ外は描画しないらしいのでいいですが。)
描画の仕方のイメージ

- 補足 -

以前私がやろうとしていたように、X,Y座標を2つ指定して、2点を通る直線を描画、としたい場合は、上のモジュールに

#deffunc line3 int _p1,int _p2,int _p3,int _p4
line2 _p1,_p2,atan(_p3,_p4)
return

を追加 (「#deffunc line2」~「return」の後に) して、line3命令を使ってください。

使い方;(X座標,Y座標)が(_p1,_p2)、(_p3,_p4)の点を通る直線を描画。

おまけ