Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Декорировать прямые углы уголками #47

Open
Mingun opened this issue May 18, 2019 · 8 comments
Open

Декорировать прямые углы уголками #47

Mingun opened this issue May 18, 2019 · 8 comments
Assignees

Comments

@Mingun
Copy link

Mingun commented May 18, 2019

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

По следам комментария на хабре.

Есть идея рисовать для прямых углов индикатор того, что они прямые. Варианты реализации:

  • Вместо дуги рисовать уголок. В тексте, чтобы уголок не воспринимался как квадрат, можно продлить стороны фигуры за границы получающегося квадрата. Проблема с этим вариантом -- может быть некрасиво выглядящее объединение нескольких углов. Кроме того, если по смыслу требуется показать, что несколько углов образуют прямой, это совсем не будет работать
  • В таком случае второй вариант: рисовать дугу, как и прежде, но внутри дуги тонкой линией нарисовать уголок, примерно так:
    CornerExample
@dryabov
Copy link

dryabov commented May 18, 2019

А если уголок снаружи, но не доводить до лучей?
sq_corners

@jemmybutton
Copy link
Owner

В тех примерах, которые я пока нашел, углом обозначаются, похоже, не все прямые углы, а только прямые по построению, а если нужна часть прямого угла, то она обозначается отдельной дугой:
rightangle2
rightangle
С тем, чтобы рисовать их автоматически, возможно, есть еще одна проблема: в каком-нибудь доказательстве от противного может возникнуть необходимость обозначить как прямые два угла, которые одновременно не могут быть прямыми и уголки придется рисовать не совсем прямые.
Так что пока кажется, что для прямых углов нужно завести отдельную функцию или отдельный стиль углов.

Менять форму с дуги на уголок проще всего. А если прямой угол составлен из нескольких, то их можно рисовать отдельно (как на первой картинке).

Уголки внутри рисовать сложнее, чем снаружи, поскольку цвет линии должен зависеть от цвета фона и меняться по ходу. Или нужно делать какую-то обводку, но это не очень красиво.

Уголки снаружи выглядят симпатично, но если угол составлен из трех, то так красиво раскрасить две части не получится. Можно попробовать просто проецировать цвета составляющих углов на уголок прямого угла.

@Mingun
Copy link
Author

Mingun commented May 18, 2019

С тем, чтобы рисовать их автоматически, возможно, есть еще одна проблема: в каком-нибудь доказательстве от противного может возникнуть необходимость обозначить как прямые два угла, которые одновременно не могут быть прямыми и уголки придется рисовать не совсем прямые.

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

Уголки снаружи выглядят симпатично

А мне кажется непонятным, особенно в приведенном @dryabov примере -- оба обозначения оказались внутри одного сектора и кажутся принадлежащим ему. Может после раскраски разными цветами будет лучше, но не уверен

Вообще, мне кажется, стоит сначала реализовать самый простой вариант (особенное если вы говорите, что это легко), а затем посмотреть, как получится. Я так понимаю, нужно только отрисовку реализовать, все углы и так уже помечены своей мерой (т.е. ходить по всем местам в тексте и проставлять "тут у нас прямой угол" не нужно)?

@jemmybutton
Copy link
Owner

jemmybutton commented May 18, 2019

Теперь у углов есть атрибут, отвечающий за тип дуги 3219534
0 по умолчанию и означает обычную дугу, 1 — уголок. Следующий код:

textLabels := true;
pair A, B, C;
A := (0, 0);
B := (3u, 0);
C := (0, 2u);
byLineDefine(A, B, byred, 0, 0);
byLineDefine(B, C, byyellow, 0, 0);
byLineDefine(C, A, byblue, 0, 0);
byAngleDefine(C, A, B, byblack, 1);
angleArcType.CAB := 1; % <--------- Вот это вот
byAngleDefine(A, B, C, byblue, 0);
byAngleDefine(B, C, A, byred, 0);
draw byNamedAngleResized();
draw byNamedLineSeq(0)(AB,BC,CA);
draw byLabelsOnPolygon(C, B, A)(0, 0);

Выдает такую картинку:
rightangle

Можно добавить флаг, по которому прямым углам автоматически будет присваиваться единичка, а если нужно, можно будет поставить её вручную, как в примере, чтобы сделать какую-нибудь такую картинку.

@jemmybutton
Copy link
Owner

@Mingun @dryabov Теперь 46aa5af есть опция autoRightAngles, которая автоматически делает прямые углы уголками.
В группах прямые углы смотрятся странновато немного:
rightangledemo
Собрал всю книгу с \def\mpPre{textLabels := true; autoRightAngles := true; byDefineGenericRightAngles;}
byrne_ru_context.pdf
Всё, кажется, более или менее работает. Верстка, конечно, уехала (прямые углы стали в тексте больше и раздвинули всё немного), и я ее не поправлял.

@Mingun
Copy link
Author

Mingun commented May 18, 2019

Круто. Закройте сами задачу, когда решите, что более ничего улучшать не будите -- мне сложно об этом судить.

@dryabov
Copy link

dryabov commented May 18, 2019

@jemmybutton А почему проверка не через скалярное произведение? Длинно через компоненты записывать или просто так быстрее?

@jemmybutton
Copy link
Owner

@dryabov A это я просто забыл, что для трехмерного случая оно у меня тоже есть готовое. Спасибо, так, наверное, симпатичнее будет, в следующем коммите заменю.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants