Может ли кто-нибудь сказать мне, как лучше всего нарисовать круговой сегмент с помощью API haskell codeworld?
У меня есть метод, который работает только тогда, когда круговой сегмент отрезается ниже радиуса путем объединения трех секторов. Однако это не работает в случае, когда окружность обрезается выше радиуса.
Обновлено: моя текущая попытка изменена, чтобы быть независимой от контекста
-- 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)
@WillemVanOnsem Конечно.
CodeWorld
предоставить функцию arc
для рисования круговых сегментов. arc init_angle finish_angle radius
@Ismor Arc создает правильную форму, но я не могу заполнить дугу цветом. Я также пытался соединить два конца дуги с помощью полилинии, чтобы получить замкнутую форму, но я не знаю функции, которая может окрашивать замкнутую линию.
@NoahLanson Чтобы лучше тебя понять, тебе нужна форма полумесяца, не так ли?
@Ismor Нет, я ищу круглый сегмент. Окружность, отрезанная ниже определенной координаты y.
Я думаю, что самый простой способ — обрезать круг под нужным вам углом. Итак, процесс идет.
(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
Это то, что я искал! Я не знал о функции clipped
. Спасибо
Поделитесь своей текущей попыткой.