Let's write β

プログラミング中にできたことか、思ったこととか

底辺が下になるように正多角形の角の位置を計算するには

多角形を描画するにあたって底辺が画面の下に位置するように多角形を描画したいときはどのようにすれば良いでしょうか。
何気なく角度をつかって頂点の座標を計算してしまうと、角が下にきたり、辺が下にきたりと多角形の形状によってまちまちと
なってしまいます。ですから、先に底辺をかたち作る頂点から計算しはじめると良いのです。
ある点centerPointを中心として、半径radiusの円に内接するnum個の頂点を持つ正多角形の頂点の座標を
底辺が下に来るように計算する関数は以下のとおりです

(defun deg-to-rad (deg)
  (/ (* deg common-lisp:PI) 180))

(defun calc-polygon-vertex (centerPoint radius num)
  (let* ((2pi (* 2 180))
         (one-corner (/ 2pi num))
         (half-corner (/ one-corner 2))
         (first-corner (- (* (/ 3 2) 180) half-corner)))
    (loop for deg from first-corner upto (+ 2pi first-corner (- one-corner)) by one-corner
          collect (make-instance 'Point 
                                 :x (+ (x centerPoint) 
                                       (* radius (cos (deg-to-rad deg))))
                                 :y (- (y centerPoint)
                                       (* radius (sin (deg-to-rad deg))))))))

ポイントはfirst-cornerの定義です。これ270度から一つの角の半角を引いた角度となっています。
この点は丁度、底辺の線分の端点に一致します、この点から角度の計算を開始する事で、どのような多角形でも確実に底辺が画面下に描画されるようになります。
(ちなみに最後のPointのインスタンスを生成するときのy座標の計算は、この関数を利用するプログラムがSDLの左上を(0,0)とし下向きにy軸が配置されている
座標系であるからです、座標系によって適宜変換してください)