Круговой сегмент в Haskell CodeWorld

Может ли кто-нибудь сказать мне, как лучше всего нарисовать круговой сегмент с помощью 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)

Поделитесь своей текущей попыткой.

Willem Van Onsem 23.03.2022 09:23

@WillemVanOnsem Конечно.

Noah Lanson 23.03.2022 09:36
CodeWorld предоставить функцию arc для рисования круговых сегментов. arc init_angle finish_angle radius
lsmor 23.03.2022 10:13

@Ismor Arc создает правильную форму, но я не могу заполнить дугу цветом. Я также пытался соединить два конца дуги с помощью полилинии, чтобы получить замкнутую форму, но я не знаю функции, которая может окрашивать замкнутую линию.

Noah Lanson 23.03.2022 10:29

@NoahLanson Чтобы лучше тебя понять, тебе нужна форма полумесяца, не так ли?

lsmor 23.03.2022 11:36

@Ismor Нет, я ищу круглый сегмент. Окружность, отрезанная ниже определенной координаты y.

Noah Lanson 23.03.2022 13:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
225
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что самый простой способ — обрезать круг под нужным вам углом. Итак, процесс идет.

  • Постройте сплошную координату круга (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. Спасибо

Noah Lanson 24.03.2022 00:44

Другие вопросы по теме