誰能告訴我使用haskell codeworld API繪制圓形線段的最佳方法?
我有一種方法,僅當通過組合三個扇區將圓形段截斷到半徑以下時才有效。但是,這在圓在半徑上方被截斷的情況下不起作用。
編輯:我當前的嘗試修改為與背景關系無關
-- x = coords of the centre of the circle
-- y = A point on the circumference
-- z = the y-axis to cut off the circle at.
Segment :: Point -> Point -> Double -> Picture
Segment x y z = case capCutOffPoints x (pointDistance x y) z of
Nothing
| z <= snd x - pointDistance x y -> translated (fst x) (snd x) (solidCircle (pointDistance x y))
| otherwise -> blank
Just points
| snd (fst points) < snd x -> solidPolygon [(fst x, snd x 0.5*(pointDistance x y)), fst points, snd points] & translated (fst x) (snd x) (sector (fst (capArcAngles x points) 2*pi) (snd (capArcAngles x points)) (pointDistance x y))
| otherwise -> translated (fst x) (snd x) (sector (fst (capArcAngles x points)) (snd (capArcAngles x points)) (pointDistance x y))
-- | Returns the points at which the circle of the cap is cut off at.
capCutOffPoints :: Point -> Double -> Double -> Maybe (Point, Point)
capCutOffPoints centre radius y = points
where
sqrtX = sqrt (radius^2 - (y - (snd centre))^2)
points
| isNaN sqrtX = Nothing
| otherwise = Just ((sqrtX fst centre, y), (-sqrtX fst centre, y))
-- | Returns the angle from the centre of the cap circle to the cut off points
-- Modified to always return an angle between 0 and 2pi
capArcAngles :: Point -> (Point, Point) -> (Double, Double)
capArcAngles centre points = (a2, a1)
where
a1 = atan2 (snd (fst points) - snd centre) (fst (fst points) - fst centre)
a2 = atan2 (snd (snd points) - snd centre) (fst (snd points) - fst centre)
pointDistance :: Point -> Point -> Double
pointDistance p1 p2 = sqrt ((abs ((fst p1) - (fst p2)))^2 (abs ((snd p1) - (snd p2)))^2)
uj5u.com熱心網友回復:
我認為最簡單的方法是以你想要的角度剪掉圓圈。所以程序進行了。
- 繪制實心圓坐標
(0,0) - 將其移動到所需的坐標以生成段
- 使用矩形剪輯它
- 將其移回原始位置。
下面的代碼在給定角度上生成實心圓段,并以(0,0)
import CodeWorld
-- |- Angle |- Radious
circularSegment :: Double -> Double -> Picture
circularSegment ang r = translated 0 (- translation_dir * translation_amount) -- Translate back
$ clipped (2*r) (2*r) -- clip it using rectangle
$ translated 0 (translation_dir * translation_amount) -- translate it
$ solidCircle r -- plot a solid circle
where s = r * sin ang
translation_amount = r abs s -- you want to translate your circle a the radious the sin of the angle
translation_dir = - signum s -- you want to translate the circle in the oposite direction as the sinus
舉個例子。下面的代碼產生給定的圖片
topCirc = circularSegment (pi / 4) 3
bottomCirc = coloured red $ circularSegment ( - pi / 4) 3
main = drawingOf $ topCirc
<> bottomCirc

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448837.html
