Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
1

Нарисовать пятиугольник из дуг на канве

22.06.2017, 17:30. Просмотров 947. Ответов 12
Метки нет (Все метки)

Здравствуйте уважаемые форумчане!
Пытаюсь нарисовать правильный пятиугольник с закругленными сторонами. Загуглил формулу рисования пятиугольника, примерно выглядит так:
Java
1
2
3
4
5
6
7
polygonPathBorder.moveTo((mBorderRect.centerX() + radiusBorder * (float) Math.cos(0)), 
                                        (mBorderRect.centerY() + radiusBorder * (float) Math.sin(0)));
 
for (int i = 1; i < 5; i++) {
  polygonPathBorder.lineTo((mBorderRect.centerX() + radiusBorder * (float) Math.cos(sectionBorder * i)),
                                       (mBorderRect.centerY() + radiusBorder * (float) Math.sin(sectionBorder * i)));
}
Далее пытался с помощью метода addArc, сделать дугу, но что-то мне подсказывает, что это не правильный подход:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RectF ovalBorder = new RectF();
 
for(int i = 0; i < 4; i++) {
  if(i == 0) {
    ovalBorder.set(mBorderRect.centerX() + radiusBorder * (float) Math.cos(i),
                          mBorderRect.centerY() + radiusBorder * (float) Math.sin(i),
                          mBorderRect.centerX() + radiusBorder * (float) Math.cos(sectionBorder * (i + 1)),
                          mBorderRect.centerY() + radiusBorder * (float) Math.sin(sectionBorder * (i + 1)));
  } else {
    ovalBorder.set(mBorderRect.centerX() + radiusBorder * (float) Math.cos(sectionBorder * (i)),
                          mBorderRect.centerY() + radiusBorder * (float) Math.sin(sectionBorder * (i)),
                          mBorderRect.centerX() + radiusBorder * (float) Math.cos(sectionBorder * (i + 1)),
                          mBorderRect.centerY() + radiusBorder * (float) Math.sin(sectionBorder * (i + 1)));
  }
  polygonPathBorder.addArc(ovalBorder, 10, 70);
}
Как дальше быть?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2017, 17:30
Ответы с готовыми решениями:

Нарисовать пятиугольник
Кто может написать прогу где будет нарисован пятиугольник на желтом фоне, очень срочно нужно!

Нарисовать пятиугольник
Всем привет!!) Нужна программа которая рисует пятиугольник в паскале.

Нарисовать равносторонний пятиугольник
Подскажите пожалуйста как задать код на C# чтобы строился равносторонний пятиугольник, там как я...

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

Нарисовать закрашенный пятиугольник
Нарисовать закрашенный пятиугольник. При нажатии клавиш перемещения курсора пятиугольник должен...

12
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 12:59  [ТС] 2
Никто, не знает?
0
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,073
25.06.2017, 13:11 3
serSeventin,

Не по теме:

многие догадываются но не желают снизойти

формулу имеете? нарисовать карандашом пробовали? что получается?
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 14:49  [ТС] 4
vxg, дело в том, что геометрию я давно забыл, именно поэтому, в данный момент, ищу готовое решение, карандашом пробовал рисовать, думал, что нашёл решение, которое выше, но почему то, не получается, и поэтому создал тему.
0
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,073
25.06.2017, 14:52 5
serSeventin, если желание покорить Мир разбилось о рисование пятиугольника и скатилось в поиск готового кода стоит ли мучаться?...
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 15:25  [ТС] 6
vxg, да, это того стоит!

Добавлено через 30 минут
vxg, и кстати, за место того, чтобы читать нотации, лучше бы подсказали, раз весь мир уже покорен вами.
0
Vladimirys
318 / 213 / 29
Регистрация: 16.01.2010
Сообщений: 621
25.06.2017, 15:27 7
Цитата Сообщение от serSeventin Посмотреть сообщение
правильный пятиугольник с закругленными сторонами.
А это как вообще выглядит то? Что то несусветное. Что то типа: - по реке плывет кирпич, деревянный как стекло, ну и пусть себе плывет, нам не нужен пенопласт...
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 15:29  [ТС] 8
Вот так:
0
Изображения
 
Vladimirys
318 / 213 / 29
Регистрация: 16.01.2010
Сообщений: 621
25.06.2017, 15:32 9
Так это уже и не правильный пятиугольник, когда стороны скруглили углы ушли. Теперь это просто - многоугольник.
PS. Где в сети читал, там там гражданин хотел узнать как нарисовать пятиугольник с закругленными углами(!) Ну как можно угол закруглить... Это же полное неуважение к геометрии.
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 15:36  [ТС] 10
Vladimirys, все могут представить, что такое правильные пятиугольник, поэтому я и написал, правильный пятиугольник, а затем добавил, с закругленными сторонами, потому что мысленно, все могут закруглить стороны, к тому же, данный пятиугольник, раньше был правильным, а затем ему закруглили стороны.
0
Vladimirys
318 / 213 / 29
Регистрация: 16.01.2010
Сообщений: 621
25.06.2017, 15:39 11
Ну значит и рисовать его пробуйте по другому. Не как правильный пятиугольник. А например дугами, соединенными в определенных точках.
0
serSeventin
1 / 1 / 0
Регистрация: 09.11.2015
Сообщений: 155
25.06.2017, 15:43  [ТС] 12
Vladimirys, посмотрите внимательно на код, я так и пытаюсь сделать, сначала рисую дуги, а потом их объединяю, если заметили ошибку, то напишите, буду очень благодарен!
0
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,073
25.06.2017, 20:32 13
Лучший ответ Сообщение было отмечено vxg как решение

Решение

serSeventin, вот так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package ru.app.canvas_test;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.DisplayMetrics;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
 
public class MainActivity extends Activity {
 
    private ImageView img;  
    private Bitmap bmp;
    private Canvas canvas;
    private Paint paint;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_main);
        
        img = (ImageView)findViewById(R.id.img);
 
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        bmp = Bitmap.createBitmap(metrics.widthPixels, metrics.heightPixels, Bitmap.Config.ARGB_8888);
        
        canvas = new Canvas(bmp);
        
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeJoin(Paint.Join.ROUND);
        
        img.setImageBitmap(bmp);
 
        clear();
        draw();
    }
    
    private void draw() {
        paint.setColor(Color.rgb(255,  255, 255));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
        
        /*
         * помним - ось Y направлена вниз - поэтому углы отсчитываются по часовой стрелке
         */
        
        float cx = bmp.getWidth() / 2;
        float cy = bmp.getHeight() / 2;
        
        float r = 100; 
        float n = 5;
        float da = 2 * (float)Math.PI / n;
        float a0 = -(float)Math.PI / 2;
        
        float r2 = 300; //радиус дуги
        float h = r * (float)Math.sin(da / 2); //половина длины стороны многоугольника
        float da2 = 2 * (float)Math.asin(h / r2); //угол дуги
        float r3 = (float)Math.sqrt(r2 * r2 - h * h) - (float)Math.sqrt(r * r - h * h); //расстояние от центра дуги до центра многоугольника
        
        Path path = new Path();
        
        //многоугольник со сторонами в виде отрезков
        /*float x = cx + r * (float)Math.cos(a0);
        float y = cy + r * (float)Math.sin(a0);
        path.moveTo(x, y);
        for (int i = 1; i <= n; i++) {
            x = cx + r * (float)Math.cos(a0 + da * i);
            y = cy + r * (float)Math.sin(a0 + da * i);
            
            path.lineTo(x, y);
        }*/
        
        //многоугольник со строрнами в виде дуг
        for (int i = 1; i <= n; i++) {
            float a2 = a0 + da * i - da / 2; //угол из центра к середине стороны
            
            //центр дуги
            float cx2 = cx - r3 * (float)Math.cos(a2);
            float cy2 = cy - r3 * (float)Math.sin(a2);
            
            RectF oval = new RectF(cx2 - r2, cy2 - r2, cx2 + r2, cy2 + r2);
            
            /*
             * еще раз - помним - ось Y направлена вниз - поэтому углы отсчитываются по часовой стрелке
             */
 
            path.arcTo(oval, (a2 - da2 / 2) * 180 / (float)Math.PI, da2 * 180 / (float)Math.PI, true);
        }
        
        canvas.drawPath(path, paint);
        
        img.invalidate();
    }
 
    private void clear() {
        paint.setColor(Color.rgb(255, 127, 127));
        paint.setStyle(Paint.Style.FILL);
        
        canvas.drawRect(0, 0, bmp.getWidth(), bmp.getHeight(), paint);
        
        img.invalidate();
    }
}
4
Миниатюры
Нарисовать пятиугольник из дуг на канве  
25.06.2017, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2017, 20:32

Нарисовать правильный пятиугольник
Для всех задач входные данные записываются в файл input.txt, а выходные в output.txt. По окончании...

Как нарисовать пятиугольник в PictureBox
Доброе время суток подскажите пожалуйста, как реализовать рисование пятиугольника в picturebox???

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


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

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

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