Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
#1

Скруглить некоторые углы полигона

10.07.2014, 10:59. Просмотров 1564. Ответов 10
Метки нет (Все метки)

Суть проблемы: Есть массив точек соединив которые друг с другом получим полигон. Углы полигона нужно скруглить по определённому радиусу. На выходе нужно получить экземпляр класса Path в котором будет содержаться этот самый полигон со скруглёнными углами. Загвоздка в том, что скруглять нужно не все углы, а только некоторые, а штатные средства не обладают такой гибкостью. Кто что посоветует ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 10:59
Ответы с готовыми решениями:

Закругленные углы
Как с помощью xml закруглить? <RelativeLayout...

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

Закруглить углы у ImageView
Здравствуйте! Подскажите как проще всего закруглить углы у ImageView?, лучше...

Glide, ImageView и скругленные углы
Есть задачка: есть ImageView. Какие возможности имеются для того, чтобы...

Узнать углы положения смартфона в пространстве
Как можно узнать углы положения смартфона в пространчтве? Без гироскопа и...

10
krapotkin
3397 / 3009 / 1042
Регистрация: 14.04.2014
Сообщений: 14,583
Записей в блоге: 15
10.07.2014, 20:22 #2
в path как должен выглядеть "скругленный" угол?
0
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
10.07.2014, 23:02  [ТС] #3
Цитата Сообщение от krapotkin Посмотреть сообщение
в path как должен выглядеть "скругленный" угол?
Примерно как-то так (старался в paint'е как мог ):
Название: Безымянный.png
Просмотров: 108

Размер: 2.6 Кб
0
krapotkin
3397 / 3009 / 1042
Регистрация: 14.04.2014
Сообщений: 14,583
Записей в блоге: 15
11.07.2014, 04:48 #4
вопрос в другом.
path - это набор рисовальных примитивов
отрезок, дуга, кривая безье
чем должны быть эти скругления?.
по идее, безье подходит
первая и последняя точка находятся на исх. линии, вторая и третья - в точке угла.

а надо там скруглять угол или нет - это вопрос исключительно как вы данные храните
храните набор точек плюс признак скругления, либо как на этом рисунке - первую и последнюю - не скруглять.
по этим данным рисуете path
1
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
11.07.2014, 08:03  [ТС] #5
Цитата Сообщение от krapotkin Посмотреть сообщение
чем должны быть эти скругления?
Дугой или кривой Безье
Цитата Сообщение от krapotkin Посмотреть сообщение
первая и последняя точка находятся на исх. линии, вторая и третья - в точке угла.
Я тоже сначала думал что все так просто, но потом ужаснулся во что выгибается мой полигон при таком подходе (особенно когда две соседние вершины стоят рядом). Там есть какие-то геометрические тонкости которые мне неподвластны. И проблема именно в этом: Как зная координаты трех точек сгладить угол который образуют два отрезка которые через эти точки проходят ?
Название: Безымянный.png
Просмотров: 106

Размер: 5.3 Кб
0
krapotkin
3397 / 3009 / 1042
Регистрация: 14.04.2014
Сообщений: 14,583
Записей в блоге: 15
11.07.2014, 10:51 #6
чтобы знать, как сгладить угол, нужно определить, что значит "сгладить угол"
вот картинка из вики. что не устраивает?
http://ru.wikipedia.org/wiki/Кривая_...zier_2_big.gif
0
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
11.07.2014, 12:07  [ТС] #7
Цитата Сообщение от krapotkin Посмотреть сообщение
чтобы знать, как сгладить угол, нужно определить, что значит "сгладить угол"
Сложно точно передать словами, попробую объяснить на примере:
Мне нужно достичь такого же эффекта который получается когда для Paint'а вызывают метод:
Java
1
redPaint.setPathEffect(new CornerPathEffect(25));
При помощи этого я могу нарисовать Path со скруглёнными углами, это меня устраивает всем кроме одного - сглаживаются все углы, как я уже писал. На картинке ниже изображены два полигона: Синий это без всякого скругления, а красный это то что мне хочется получить.
Скруглить некоторые углы полигона
0
krapotkin
3397 / 3009 / 1042
Регистрация: 14.04.2014
Сообщений: 14,583
Записей в блоге: 15
11.07.2014, 21:24 #8
я теряю нить. В чем проблема-то? Все исходные на руках. Рисование двумя процедурами либо ровно, либо криво.
У нас есть набор точек и набор знаний, в каких точках сглаживание, в каких - нет.
И то и другое - массивы

в цикле от 0 до N
Java
1
2
3
4
5
6
7
 {
if (IsCurve[i])
   path.cubicTo(.....);
else
  path.moveTo(x[i], y[i]);
}
canvas.drawPath(path, paint);
Кликните здесь для просмотра всего текста
http://developer.alexanderklimov.ru/android/catshop/android.graphics.path.php
0
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
11.07.2014, 22:34  [ТС] #9
Цитата Сообщение от krapotkin Посмотреть сообщение
В чем проблема-то?
Если вам это не очень сложно, не могли бы вы написать кусок работающего кода ?
Конкретно мне не понятно что я должен передавать в качестве аргументов в метод cubicTo. Я много чего перепробовал уже, в том числе и рисовать скруглённые углы при помощи кривых безье, нужного эффекта не достиг, линия изгибается совсем не так как мне бы хотелось.
0
krapotkin
3397 / 3009 / 1042
Регистрация: 14.04.2014
Сообщений: 14,583
Записей в блоге: 15
12.07.2014, 07:58 #10
Лучший ответ Сообщение было отмечено angryrobot как решение

Решение

кусок работающего кода я прислал, смотрите под плюсиком

как вы рисовали безье, если cubicTo - это оно и есть?
у кривой есть точка начала - это последняя точка из нарисованных в Path. если точек еще не было ставим туда moveTo.
далее в параметрах указываются координаты двух контрольных точек, в нашем случае они будут одинаковыми
и последние, 5-й и 6-й параметры - это точка окончания кривой
в вашем случае единственная проблема, что перед тем, как рисовать кривую, нужно определить ее точки начала и конца.
Координаты контрольных точек - это ваши исх координаты угла
у точки начала и окончания кривой нужно вычислить. Например как 1/10 от длины отрезка от угла до угла
тогда для отрезка MN (Xm, Ym)-(Xn, Yn) это точка P (Xp, Yp) где Xp=Xm+(Xn-Xm)*9/10, Yp=Ym+(Yn-Ym)*9/10
на отрезке NK будет точка Q - вместо 9/10 пишем 1/10
получим

moveTo M
lineTo P
cubicTo N,N,Q
lineTo K

и так для каждой пары отрезков MN NK
2
angryrobot
Командир зеленых роботов
348 / 285 / 54
Регистрация: 08.10.2013
Сообщений: 565
12.07.2014, 13:05  [ТС] #11
Цитата Сообщение от krapotkin Посмотреть сообщение
как вы рисовали безье, если cubicTo - это оно и есть?
У меня проблема была в том, что я пытался рисовать ВЕСЬ угол одной большой кривой безье (без двух прямых)
То что вы написали похоже работает:
Скруглить некоторые углы полигона

Большое спасибо, вы мне очень помогли
0
12.07.2014, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 13:05

Нужно у изображения обрезать углы по радиусу
Где тут уже на форуме было, не могу найти. Короче на задний фон виджета...

Скруглить углы многоугольника (полигона)
В общем есть задание построить многоугольник любой формы и закруглить его углы....

Как скруглить углы у чекбокса
Подскажите как скруглить углы у чекбокса На каждый вопрос создавайте по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru