Скрипт для рисования, заливки и группировки треугольников в Livecode?

Будем признательны за любую помощь в разработке фрагмента скрипта Livecode для рисования и заполнения группы равносторонних треугольников.

Я работаю над приложением с открытым исходным кодом, которое помогает людям создавать и делиться историями с фрактальным узором.

Ключевой задачей является рисование треугольников, которые будут представлять следующие элементы истории:

  • Аттрактор
  • Вызов
  • Возможность (изменение состояния для снятия напряжения)
  • Стратегия
  • Контрольная работа
  • Решение

Каждый из шести стандартных элементов истории, указанных выше, будет отображаться в приложении в виде равностороннего треугольника. Каждый элемент, в свою очередь, будет связан с определенным цветом — желтым, красным, оранжевым, фиолетовым, синим или зеленым.

Я бы хотел, чтобы скрипт Livecode рисовал шесть треугольников, которые совмещались бы, как кусочки пирога, и образовывали бы шестиугольник, представляющий все повествование.

Прозрачность (уровень смешивания) каждого цветного сегмента будет указывать на степень, в которой автор(ы) рассказа или приглашенные рецензенты считают этот элемент рассказа завершенным.

Я надеюсь придумать скрипт на Livecode, который будет:

  • быстро нарисуйте шесть треугольников, чтобы сформировать шестиугольную форму

  • заполните каждый треугольник соответствующим цветом (каждый цвет будет иметь начальный уровень смешивания почти прозрачного 90 процентов)

  • присвоить уникальное короткое имя каждому из шести треугольников на основе названия его цвета заливки

  • сгруппируйте шесть треугольников, чтобы их можно было перетаскивать вместе в новые места на экране.

Есть ли какие-нибудь скрипты (или куски), которые могут помочь в этом? Глубоко признателен за любой образец кода или ссылки, которые помогут сократить мою кривую обучения Livecode.

Лучший,

Марк Фрейзер

====== Обновление прогресса! ====== [2 августа, 18:00 по восточному поясному времени]

Я только что нашел и адаптировал скрипт генерации полигонов Ллойда Рибера из Univ. Грузии, которая создает шестиугольники. Есть ли способ настроить его так, чтобы он мог создать равносторонний треугольник, который затем можно скопировать и повернуть, чтобы заполнить шестиугольник?

on mouseUp
global tpoints
if exists(grc "HexagonCanvas" of this card) then delete grc "HexagonCanvas"
lock screen
create grc "HexagonCanvas" 
set the loc of grc "HexagonCanvas" to "140,140"
set the opaque of grc "HexagonCanvas" to true
-- resize the new grc
get the rect of grc "HexagonCanvas" 
add 80 to item 4 of it
set the rect of grc "HexagonCanvas" to it
put the topleft of grc "HexagonCanvas" into TL
put the topright of grc "HexagonCanvas" into TR
put the bottomleft of grc "HexagonCanvas" into BL
put the bottomright of grc "HexagonCanvas" into BR
put the width of grc "HexagonCanvas" into twidth
put the height of grc "HexagonCanvas" into theight
put trunc(twidth/4) into twidthquart
put trunc(theight/2) into theighthalf
#=========set the points for the "free" hexagon polygon==================
put empty into tpoints
put (item 1 of TL + twidthquart, item 2 of TL) into tpoints
# for the first line of tpoints "put into"
put Cr& (item 1 of TL, item 2 of TL + theighthalf) after tpoints
put CR& (item 1 of BL + twidthquart, item 2 of BL) after tpoints
put CR& (item 1 of BR - twidthquart, item 2 of BR) after tpoints
put Cr& (item 1 of BR, item 2 of BR - theighthalf) after tpoints
put CR& (item 1 of TR - twidthquart, item 2 of TR) after tpoints
put CR& (item 1 of TL + twidthquart, item 2 of TL) after tpoints
set the points of grc "HexagonCanvas" to tpoints
set the style of grc "HexagonCanvas" to "polygon"
set the backgroundColor of grc "HexagonCanvas" to blue
set the blendlevel of grc "HexagonCanvas" to "60"
choose browse tool
end mouseUp

person Mark Frazier    schedule 01.08.2013    source источник
comment
Ниже я добавил код, который рисует 6 треугольников. Посмотри на это.   -  person z--    schedule 14.08.2013


Ответы (3)


Самое сложное в этом — рисовать на лету. Конечно, вы можете написать процедуру, которая создаст ваш шестиугольный пирог, но лучше нарисовать его один раз и просто показать или скрыть.

Сама вещь будет представлять собой группу из шести треугольников, к каждому из которых можно обращаться и задавать свои свойства, цвет, blendLevel и т.д.

Если вам нужно несколько копий этого гаджета, вы можете клонировать группу и переименовать как ее, так и ее треугольные компоненты по желанию.

Одно предостережение. Если вы будете действовать таким образом, вы должны знать, что только для групп среди всех классов объектов ключевое слово «последний» не является устойчивым. Таким образом, ваша возможность ссылаться на эту новую группу (установить имя последней группы как «yourNewGroupname») ограничена таким образом. Однако есть обходной путь с использованием группы шаблонов, который отлично работает. Я рекомендую вам прочитать примечания пользователя в словаре под «последним»:

----Ключевое слово «последнее» не является устойчивым при обращении к группам. Поэтому, если кто-то создает несколько групп, ссылка на «последнюю» группу может не возвращать группу, фактически созданную последней. Использование "templateGroup" является обходным путем, так как при создании новой группы можно, например, установить имя templateGroup на что-то уникальное и иметь возможность найти последнюю группу по имени. Кроме того, для поиска последней группы можно использовать перехват сообщения «newGroup» с помощью соответствующего сценария.

Надеюсь это поможет...

РЕДАКТИРОВАТЬ.

Знакомы ли вы с соответствующими свойствами? «backColor» для установки цвета, «blendLevel» для установки, ну, blendLevel и т. д.? Вы когда-нибудь создавали изображение, похожее на треугольник, и называли его? Вы когда-нибудь группировали объекты?

person dunbarx    schedule 01.08.2013
comment
Когда не стабильно? - person Jacque; 02.08.2013
comment
Трудно полагаться на последний идентификатор с группами. В основном при работе с группами, которые находятся в других группах, или когда они ретранслируются движком автоматически (например, после остановки редактирования ‹group›). - person BvG; 02.08.2013
comment
Крейг, большое спасибо за ваши идеи. До сих пор мне удавалось нарисовать шестиугольник с помощью следующего скрипта: в инструменте «Выбор линии» для мыши установите скорость перетаскивания на 0, перетащите от 200 200 до 300 267, перетащите от 300 267 до 300 367, перетащите от 300 367 до 200 433, перетащите от 200 433 до 100 367, перетащите от 100 367 до 100 267 перетащите от 100 267 до 200 200 выберите инструмент обзора end mouseUp Но я не вижу, как назвать и сохранить новую графику в виде многоугольника, поэтому я могу сделать все остальное: -- установить цвет фона grc HexagonCanvas на синий -- установить уровень смешивания grc HexagonCanvas до 60 - person Mark Frazier; 03.08.2013
comment
(продолжение) Я надеюсь попробовать аналогичный скрипт, создающий равносторонний треугольник — треугольник, который можно скопировать шесть раз (вокруг центра шестиугольника с шагом 60 градусов) на одной линии с краями шестиугольника. - person Mark Frazier; 03.08.2013

Очень трудолюбивый. Действительно.

Я хотел создать треугольную графику с помощью инструмента «Многоугольник». Вы можете установить количество сторон изображения равным 3 и назвать его, скажем, «t1». Возможно, вам придется настроить его так, чтобы он выглядел как равносторонний. Теперь это полноценный объект, и его можно дублировать пять раз. Каждый новый объект можно назвать соответствующим образом («t2», «t3» и т. д.) и повернуть так, чтобы вы могли собрать их все в красивый шестиугольник.

Теперь вы можете установить backColor и blendLevel каждой графики по своему усмотрению. Убедитесь, что для каждого изображения свойство «opaque» установлено на «true». Если вы сгруппируете шесть, вы можете клонировать новые группы, но вам придется управлять именами потомков треугольников.

Вернемся к вашим предыдущим усилиям. Вы можете видеть, что даже если вы создали красивую графику с помощью линий, не было бы простого способа изолировать отдельные треугольные секции. Полигональный объект прекрасно исправляет это.

Крейг

person dunbarx    schedule 03.08.2013

Справочник

http://en.wikipedia.org/wiki/Equilateral_triangle

Этап итерации

Я взял сценарий, который вы нашли, и с некоторыми небольшими изменениями он прекрасно работает. Существует

polygon polygonName, px, py, pColor

сценарий, который вызывается 4 раза сценарием мыши. Он рисует 4 шестиугольника разных цветов.

Скрипт многоугольника не соответствует своему названию, так как может рисовать только шестиугольники.

А затем скрипт mouseup, который шесть раз использует скрипт треугольника.

on mouseup
   polygon "hex1", 100, 300, "green"
   polygon "hex2", 240, 300, "yellow"
   polygon "hex3", 380, 300, "red"
   polygon "hex4", 520, 300, "brown"
end mouseup

on polygon polygonName, px, py, pColor
   global tpoints
   local TL
   local TR
   local BL
   local BR
   local twidth
   local theight
   local twidthquart
   local theighthalf
if exists(grc polygonName of this card) then delete grc polygonName
lock screen
create grc polygonName 

set the loc of grc polygonName to px,py 

set the opaque of grc polygonName to true
-- resize the new grc
get the rect of grc polygonName 
add 80 to item 4 of it
set the rect of grc polygonName to it
put the topleft of grc polygonName into TL
put the topright of grc polygonName into TR
put the bottomleft of grc polygonName into BL
put the bottomright of grc polygonName into BR
put the width of grc polygonName into twidth
put the height of grc polygonName into theight
put trunc(twidth/4) into twidthquart
put trunc(theight/2) into theighthalf
#=========set the points for the "free" hexagon polygon==================
put empty into tpoints
put (item 1 of TL + twidthquart, item 2 of TL) into tpoints
# for the first line of tpoints "put into"
put Cr& (item 1 of TL, item 2 of TL + theighthalf) after tpoints
put CR& (item 1 of BL + twidthquart, item 2 of BL) after tpoints
put CR& (item 1 of BR - twidthquart, item 2 of BR) after tpoints
put Cr& (item 1 of BR, item 2 of BR - theighthalf) after tpoints
put CR& (item 1 of TR - twidthquart, item 2 of TR) after tpoints
put CR& (item 1 of TL + twidthquart, item 2 of TL) after tpoints
set the points of grc polygonName to tpoints
set the style of grc polygonName to "polygon"
set the backgroundColor of grc polygonName to pColor
set the blendlevel of grc polygonName to "60"
choose browse tool
end polygon

Следующий шаг

Продолжить можно разными способами.

Простым способом было бы изменить сценарий многоугольника, чтобы он работал с треугольниками, а не с шестиугольником. В качестве параметров ему требуется положение треугольника (следуя «соглашению о циферблате часов или указывая сектор в градусах)

Координаты

                  (-r/2 ,h)                (r/2,h)




      -r/0                      0                        r/ 0




                  (-r/2 ,h)                (r/2,h)

r = радиус h = высота

h*h + (r/2)*(r/2) = r*r

Код, который рисует шесть треугольников

`

on mouseUp
   global tOffset
   put 140 into tOffset
   triangle "triangle1", -50,100, 0,0, -100, 0, "red"
   triangle "triangle2", 0,0,  -50, 100, 50,100, "green"
   triangle "triangle3", 50, 100,  100, 0, 0,0, "blue"
   triangle "triangle4", 0, 0,  100, 0, 50, -100, "yellow"
   triangle "triangle5", 0, 0,  50, -100, -50, -100, "orange"
   triangle "triangle6", 0, 0,  -50, -100, -100, 0, "purple"
end mouseUp


on triangle polygonName, pax, pay, pbx, pby, pcx, pcy, pColor

   global tpoints
   global tOffset

   if exists(grc polygonName of this card) then delete grc polygonName

   lock screen

   create grc polygonName 
   set the loc of grc polygonName to pax,pay 
   set the opaque of grc polygonName to true

   put empty into tpoints

   put (tOffset+pax, tOffset+pay) into tpoints

   put Cr& (tOffset+pbx, tOffset+pby) after tpoints

   put Cr& (tOffset+pcx, tOffset+pcy) after tpoints

   set the points of grc polygonName to tpoints

   set the style of grc polygonName to "polygon"
   set the backgroundColor of grc polygonName to pColor
   set the blendlevel of grc polygonName to "20"

   choose browse tool
end triangle

Вики

Я сделал это вики-ответом сообщества, чтобы люди могли легко вставлять обновленный код.

person Community    schedule 01.08.2013