Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Wildgood
1

Определить радиус и центр такой окружности, проходящей хотя бы через три различные точки

11.03.2012, 08:16. Показов 2971. Ответов 7
Метки нет (Все метки)

Множество точек не должно превышать 100. Данные заполняются случайным образом. Результат решения необходимо проиллюстрировать графически.
Определить радиус и центр такой окружности, проходящей хотя бы через три различные точки заданного множества точек на плоскости, что минимальна разность количества точек, лежащих внутри и вне окружности.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2012, 08:16
Ответы с готовыми решениями:

Найти радиус и центр окружности, проходящей через N (N>=3) точек первого множества
условие задачи такое " Найти радиус и центр окружности, проходящей через N (N>=3) точек первого...

Определить минимальный радиус окружности которая содержит все точки
. В одномерном массиве с четным количеством элементов (2N) находятся координаты N точек плоскости....

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

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

7
765 / 545 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
11.03.2012, 11:11 2
C#
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
  static System.Random r = new System.Random((int)DateTime.Now.Ticks);
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Pen p = new Pen(Color.Lime);
            Pen elips = new Pen(Color.Blue);
            Point[] points = new Point[100];
            
            for (int i = 0; i<100 ; i++)
            {
                points[i]= new Point(r.Next(200),r.Next(200));
                e.Graphics.DrawRectangle(p, points[i].X,points[i].Y, 1, 1); 
            }
            int h = 0;
            for (double rad = 0.0; rad <6.28; rad += 0.0175) 
            {
                elips = new Pen(Color.Blue);
                Point pp = new Point((int)(Math.Cos(rad) *50),(int)(Math.Sin(rad) * 50));
                if (Array.IndexOf(points, pp) != -1)
                {
                   h++;//кол-во совпадений с точками окружнсти
                   elips = new Pen(Color.Red, 5.0F);  
                }
                e.Graphics.DrawRectangle(elips,pp.X+100,pp.Y+100, 1, 1);  
            }
            this.Text = h.ToString();
            
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1.Invalidate();
        }
0
19 / 19 / 4
Регистрация: 08.03.2012
Сообщений: 72
11.03.2012, 13:00 3
C#
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
        static System.Random rand = new System.Random((int)DateTime.Now.Ticks);
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            PointF[] points = new PointF[100];
 
            for (int i = 0; i < 100; i++)
            {
                points[i] = new PointF(rand.Next(200), rand.Next(200));
            }
 
            // (x; y), rand - координаты центра и радиус окружности
            // (x1; y1), (x2; y2), (x3; y3) - координаты трех точек
            // Система :
            // (x - x1)^2 + (y - y1)^2 = rand^2             -- f1
            // (x - x2)^2 + (y - y2)^2 = rand^2             -- f2
            // (x - x3)^2 + (y - y3)^2 = rand^2             -- f3
            // f1 - f2 --> fy :
            // 2 * y = (x1 - x2) * (2 * x - x1 - x2) / (y2 - y1) + y1 + y2
            // f2 - f3 --> gy :
            // 2 * y = (x2 - x3) * (2 * x - x2 - x3) / (y3 - y2) + y2 + y3
            // fy - gy --> fx :
            // x = (k1 * k2 / k3 - l1 * l2 / l3 + y2 - y3) / (2 * l1 / l3 - 2 * k1 / k3), где
            //  x1 - x2 = k1
            // -x1 - x2 = k2
            //  y2 - y1 = k3
            //  x2 - x3 = l1
            // -x2 - x3 = l2
            //  y3 - y2 = l3
 
            double x, y, radius;
            int pIn = 0, pOut = 0; // количество точек внутри окружности и за ее пределами
            int d = 100; // Abs(pIn - pOut)
            double X = 0;
            double Y = 0;
            double R = 0;
            for (int i = 0; i < 100; i++)
            {
                for (int j = i + 1; j < 100; j++)
                {
                    if (points[i] == points[j])
                        continue;
                    for (int k = j + 1; k < 100; k++)
                    {
                        if (points[i] == points[k] || points[j] == points[k])
                            continue;
                        pIn = 0;
                        pOut = 0;
                        // все три точки разные
                        x = fx(points[i], points[j], points[k]);
                        y = fy(x, points[i], points[j]);
                        radius = r(x, y, points[i]);
                        for (int l = 0; l < 100; l++)
                        {
                            if (l != i && l != j && l != k)
                            {
                                if (r(x, y, points[l]) > radius)
                                    pOut++;
                                else
                                    pIn++;
                            }
                        }
                        if (Math.Abs(pIn - pOut) < d)
                        {
                            d = Math.Abs(pIn - pOut);
                            X = x;
                            Y = y;
                            R = radius;
                        }
                    }
                }
            }
            Brush b = Brushes.Red;
            Pen p = new Pen(Color.LightBlue);
            //e.Graphics.FillRectangle(b, points[Points[i][0]].X - 2, points[Points[i][0]].Y - 2, 5, 5);
            //e.Graphics.FillRectangle(b, points[Points[i][1]].X - 2, points[Points[i][1]].Y - 2, 5, 5);
            //e.Graphics.FillRectangle(b, points[Points[i][2]].X - 2, points[Points[i][2]].Y - 2, 5, 5);
            p.Width = 3;
            label1.Text = "X  :  " + X.ToString();
            label2.Text = "Y  :  " + Y.ToString();
            label3.Text = "R  :  " + R.ToString();
            label4.Text = "D  :  " + d.ToString();
            e.Graphics.DrawEllipse(p, (float)(X - R / 2.0f), (float)(Y - R / 2.0f), (float)(R * 2.0f), (float)(R * 2.0f));
 
            for (int i = 0; i < 100; i++)
            {
                p.Width = 1;
                p.Color = Color.Green;
                e.Graphics.DrawRectangle(p, points[i].X, points[i].Y, 1, 1);
            }
        }
        double fx(PointF p1, PointF p2, PointF p3)
        {
            double k1, k2, k3, l1, l2, l3;
            k1 = p1.X - p2.X;
            k2 = -p1.X - p2.X;
            k3 = p2.Y - p1.Y;
            l1 = p2.X - p3.X;
            l2 = -p2.X - p3.X;
            l3 = p3.Y - p2.Y;
            return (k1 * k2 / k3 - l1 * l2 / l3 + p2.Y - p3.Y) / (2 * l1 / l3 - 2 * k1 / k3);
        }
        double fy(double x, PointF p1, PointF p2)
        {
            return ((p1.X - p2.X) * (2 * x - p1.X - p2.X) / (p2.Y - p1.Y) + p1.Y + p2.Y) / 2;
        }
        double r(double x, double y, PointF p)
        {
            return Math.Sqrt((x - p.X) * (x - p.X) + (y - p.Y) * (y - p.Y));
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox1.Invalidate();
        }
0
765 / 545 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
11.03.2012, 15:49 4
newclaus, Ресуркоемкость вашего варианта конечно впечатляет

Можно вообще без математики обойтись
C#
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
  private void pictureBox1_Click(object sender, EventArgs e)
        {
            
            Point[] points = new Point[100];
            Bitmap bit = new Bitmap(200, 200);
            Graphics g = Graphics.FromImage(bit);
 
            
            Pen p = new Pen(SystemColors.HotTrack);
            Pen elips = new Pen(Color.Purple);
 
            for (int i = 0; i < 100; i++)
            {
                points[i] = new Point(r.Next(200), r.Next(200));
                g.DrawRectangle(p, points[i].X, points[i].Y, 1, 1);
            }
            int Radius = r.Next(30, 80) ;
            Radius-= Radius%2;
            Point Centr = new Point(r.Next(100), r.Next(100));
            g.FillEllipse(Brushes.Cyan, Centr.X - 30, Centr.Y - Radius/2, Radius, Radius);
            g.DrawEllipse(elips, Centr.X - 30, Centr.Y - Radius/2, Radius, Radius);
            pictureBox1.Image = bit;
 
 
            int Out = 0;
            int In = 0;
            int Edge = 0;
            for (int i = 0; i < 100; i++)
            {
                switch (bit.GetPixel(points[i].X, points[i].Y).Name)
                {
                    case "ff0066cc":  Out++    ;break;
                    case "ff800080": Edge++; g.DrawRectangle(new Pen(Color.Red), points[i].X, points[i].Y, 1, 1); break;
                    case "ff00ffff":  In++;  g.DrawRectangle(new Pen(Color.Indigo), points[i].X, points[i].Y, 1, 1); break; 
                }
            }
            MessageBox.Show(String.Format("Out:{0}     In:{1}     Edge:{2}",Out,In,Edge));
 
        }
0
19 / 19 / 4
Регистрация: 08.03.2012
Сообщений: 72
11.03.2012, 15:59 5
Vitall, что первый, что второй код у тебя, чушь всякую выдает
В задание четко написано чтобы окружность проходила ХОТЯ БЫ ЧЕРЕЗ ТРИ ТОЧКИ. А у тебя в обоих случаях какие то произвольные круги выбираются.

Может код и затратный, но зато точный. К тому же если задание дали в институте(школе), то вряд ли препода заинтересует работа с изображениями
0
765 / 545 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
11.03.2012, 17:09 6
Цитата Сообщение от newclaus Посмотреть сообщение
что первый, что второй код у тебя, чушь всякую выдает
Не чушь, а количество точек пройденных через окружность .
Я просто проиллюстрировал принцип подбора такой окружности .Зациклить его до нахождения трех точек думал ума хватит .Если не хватает то вот
C#
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
 private void pictureBox1_Click(object sender, EventArgs e)
        {
            int Out = 0;
            int In = 0;
            int Edge = 0;
            int Radius = 0;
 
            Bitmap bit = null;
            Point Centr =new Point(0,0);
 
            while (Edge != 3)
            {
                 Out = 0;
                 In = 0;
                 Edge = 0; 
 
                Point[] points = new Point[100];
                bit = new Bitmap(200, 200);
                Graphics g = Graphics.FromImage(bit);
 
 
                Pen p = new Pen(SystemColors.HotTrack);
                Pen elips = new Pen(Color.Purple);
 
                for (int i = 0; i < 100; i++)
                {
                    points[i] = new Point(ran.Next(200), ran.Next(200));
                    g.DrawRectangle(p, points[i].X, points[i].Y, 1, 1);
                }
                Radius = ran.Next(30, 80);
                Radius -= Radius % 2;
                Centr = new Point(ran.Next(100), ran.Next(100));
                g.FillEllipse(Brushes.Cyan, Centr.X - 30, Centr.Y - Radius / 2, Radius, Radius);
                g.DrawEllipse(elips, Centr.X - 30, Centr.Y - Radius / 2, Radius, Radius);
                
 
 
              
                for (int i = 0; i < 100; i++)
                {
                    switch (bit.GetPixel(points[i].X, points[i].Y).Name)
                    {
                        case "ff0066cc": Out++; break;
                        case "ff800080": Edge++; g.DrawRectangle(new Pen(Color.Red), points[i].X, points[i].Y, 1, 1); break;
                        case "ff00ffff": In++; g.DrawRectangle(new Pen(Color.Indigo), points[i].X, points[i].Y, 1, 1); break;
                    }
                }
                 
            }pictureBox1.Image = bit;
 
            MessageBox.Show(String.Format("Out:{0}     In:{1}     Edge:{2}    Centr{3}   Radius {4} px", Out, In, Edge, Centr, Radius/2));
 
        }
Про способ подбора такой окружности ничего не сказано . Если автору надо математическим способом, пусть уточняет . Да и тем таких уже хватает ,достаточно посмотреть список похожих тем внизу страницы .
Мне было просто интересно сделать графически .
Мой хоть и не математическим зато работает в сто раз быстрее твоего ))

Добавлено через 5 минут
И потести свой получше, твой круг вообще иногда не видно ,уползает куда то
1
19 / 19 / 4
Регистрация: 08.03.2012
Сообщений: 72
11.03.2012, 19:17 7
Ну начнем с того, что где гарантия что у найденной окружности разница точек внутри и снаружи минимальная (если только она не равна 0, тогда можно с уверенностью это сказать), это еще один цикл (условие) нужно сделать, чтобы искать несколько такую окружность + условие остановки нужно обумать, на тот случай если не найдет окружность с разницей 0

Второе - это погрешность расчета eps = 0.5 (вроде такая, не маленькая скажу)

Но согласен он намного быстрее и в играх, например, самое то использовать

В моем коде, окружность уходит за край потому что центр не умещается (это нормально, если скажем три точки почти находятся на одной прямой)



Хотя вроде есть ошибка в коде

Добавлено через 44 минуты
Теперь все точно, и за орбиту круг не выползает
Код

C#
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
117
            PointF[] points = new PointF[100];
 
            for (int i = 0; i < 100; i++)
            {
                points[i] = new PointF(rand.Next(200), rand.Next(200));
            }
 
            // (x; y), rand - координаты центра и радиус окружности
            // (x1; y1), (x2; y2), (x3; y3) - координаты трех точек
            // Система :
            // (x - x1)^2 + (y - y1)^2 = rand^2             -- f1
            // (x - x2)^2 + (y - y2)^2 = rand^2             -- f2
            // (x - x3)^2 + (y - y3)^2 = rand^2             -- f3
            // f1 - f2 --> fy :
            // 2 * y = (x1 - x2) * (2 * x - x1 - x2) / (y2 - y1) + y1 + y2
            // f2 - f3 --> gy :
            // 2 * y = (x2 - x3) * (2 * x - x2 - x3) / (y3 - y2) + y2 + y3
            // fy - gy --> fx :
            // x = (k1 * k2 / k3 - l1 * l2 / l3 + y2 - y3) / (2 * l1 / l3 - 2 * k1 / k3), где
            //  x1 - x2 = k1
            // -x1 - x2 = k2
            //  y2 - y1 = k3
            //  x2 - x3 = l1
            // -x2 - x3 = l2
            //  y3 - y2 = l3
 
            float x, y, radius;
            int pIn = 0, pOut = 0; // количество точек внутри окружности и за ее пределами
            int d = 100; // Abs(pIn - pOut)
            float X = 0;
            float Y = 0;
            float R = 0;
            int z = 0, c = 0, v = 0;
            for (int i = 0; i < 100; i++)
            {
                for (int j = i + 1; j < 100; j++)
                {
                    if (points[i] == points[j])
                        continue;
                    for (int k = j + 1; k < 100; k++)
                    {
                        if (points[i] == points[k] || points[j] == points[k])
                            continue;
                        pIn = 0;
                        pOut = 0;
                        // все три точки разные
                        x = fx(points[i], points[j], points[k]);
                        y = fy(x, points[i], points[j]);
                        radius = r(x, y, points[j]);
                        for (int l = 0; l < 100; l++)
                        {
                            if (l != i && l != j && l != k)
                            {
                                if (r(x, y, points[l]) > radius)
                                    pOut++;
                                else
                                    pIn++;
                            }
                        }
                        if (Math.Abs(pIn - pOut) < d || (Math.Abs(pIn - pOut) == d && R > radius))
                        {
                            d = Math.Abs(pIn - pOut);
                            X = x;
                            Y = y;
                            R = radius;
                            z = i; c = j; v = k;
                        }
                    }
                }
            }
            Brush b = Brushes.Red;
            Pen p = new Pen(Color.LightBlue);
            //e.Graphics.FillRectangle(b, points[Points[i][0]].X - 2, points[Points[i][0]].Y - 2, 5, 5);
            //e.Graphics.FillRectangle(b, points[Points[i][1]].X - 2, points[Points[i][1]].Y - 2, 5, 5);
            //e.Graphics.FillRectangle(b, points[Points[i][2]].X - 2, points[Points[i][2]].Y - 2, 5, 5);
            label1.Text = "X  :  " + X.ToString();
            label2.Text = "Y  :  " + Y.ToString();
            label3.Text = "R  :  " + R.ToString();
            label4.Text = "D  :  " + d.ToString();
            label5.Text =
                z.ToString() + " - " + points[z].ToString() + "\n" +
                c.ToString() + " - " + points[c].ToString() + "\n" +
                v.ToString() + " - " + points[v].ToString();
            e.Graphics.DrawEllipse(p, (X - R), (Y - R), (R * 2.0f), (R * 2.0f));
            e.Graphics.DrawRectangle(Pens.Blue, X - 1, Y - 1, 3, 3);
 
            for (int i = 0; i < 100; i++)
            {
                p.Width = 1;
                p.Color = Color.Green;
                if (i == z || i == v || i == c)
                {
                    e.Graphics.DrawRectangle(Pens.Red, points[i].X, points[i].Y, 1, 1);
                }
                else
                    e.Graphics.DrawRectangle(p, points[i].X, points[i].Y, 1, 1);
            }
        }
        float fx(PointF p1, PointF p2, PointF p3)
        {
            float k1, k2, k3, l1, l2, l3;
            k1 = p1.X - p2.X;
            k2 = -p1.X - p2.X;
            k3 = p2.Y - p1.Y;
            l1 = p2.X - p3.X;
            l2 = -p2.X - p3.X;
            l3 = p3.Y - p2.Y;
            return (k1 * k2 / k3 - l1 * l2 / l3 + p1.Y - p3.Y) / (2 * l1 / l3 - 2 * k1 / k3);
        }
        float fy(float x, PointF p1, PointF p2)
        {
            return ((p1.X - p2.X) * (2 * x - p1.X - p2.X) / (p2.Y - p1.Y) + p1.Y + p2.Y) / 2;
        }
        float r(float x, float y, PointF p)
        {
            return (float)Math.Sqrt((x - p.X) * (x - p.X) + (y - p.Y) * (y - p.Y));
        }
1
0 / 0 / 0
Регистрация: 23.05.2019
Сообщений: 1
23.05.2019, 23:47 8
Цитата Сообщение от newclaus Посмотреть сообщение
Хотя вроде есть ошибка в коде
Само уравнение не особо подходит. Там гг если по Y координаты совпадут
C++
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
#include "pch.h"
#include <iostream>
#include <string.h>
 
const int N = 5;
double x, y, radius;
int pIn = 0, pOut = 0;
int d = 5, o = 0, m = 0, n = 0;
double A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0;
double X = 0;
double Y = 0;
double R = 0;
struct TPoint {
    double X, Y;
}p[N] = { {0,0},{0,2},{1,1},{4,2},{2,4} };
float r(double x, double y, TPoint  p){
    return (float)sqrt((x - p.X) * (x - p.X) + (y - p.Y) * (y - p.Y));
}
int main() {
    for (int i = 0; i < 5; i++)
    {
        for (int j = i + 1; j < 5; j++)
        {
            for (int k = j + 1; k < 5; k++)
            {
                pIn = 0;
                pOut = 0;
                A = p[j].X - p[i].X;
                B = p[j].Y - p[i].Y;
                C = p[k].X - p[i].X;
                D = p[k].Y - p[i].Y;
                E = A * (p[i].X + p[j].X) + B * (p[i].Y + p[j].Y);
                F = C * (p[i].X + p[k].X) + D * (p[i].Y + p[k].Y);
                G = 2 * (A * (p[k].Y - p[j].Y) - B * (p[k].X - p[j].X));
                x= (D * E - B * F) / G;
                y= (A * F - C * E) / G;
                radius = r(x, y, p[j]);
                for (int l = 0; l < 5; l++)
                {
                    if (l != i && l != j && l != k)
                    {
                        if (r(x, y, p[l]) > radius)
                            pOut++;
                        else
                            pIn++;
                    }
                }
                printf("%i %i %i %i %6.2f %6.2f %6.2f\n", i, j, k, abs(pIn - pOut), radius, x, y);
                if (abs(pIn - pOut) < d || (abs(pIn - pOut) == d && R > radius))
                {
                    d = abs(pIn - pOut);
                    X = x;
                    Y = y;
                    R = radius;
                    m = i;
                    n = j;
                    o = k;
                }
            }
        }
    }
    printf("%6.2f%6.2f%6.2f\n", X, Y, R);
    printf("%i %i %i %i\n", m, n, o, d);
    system("pause");
}
Формула отсюда

Добавлено через 23 минуты
А еще вот так вот можно по этой формуле
C++
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
#include "pch.h"
#include <iostream>
#include <string.h>
 
const int N = 5;
double x, y, radius;
int pIn = 0, pOut = 0;
int d = 5, o = 0, m = 0, n = 0;
double A = 0, B = 0, C = 0, D = 0, E = 0, F = 0, G = 0;
double X = 0;
double Y = 0;
double R = 0;
struct TPoint {
    double X, Y;
}p[N] = { {0,0},{0,2},{1,1},{4,2},{2,4} };
float r(double x, double y, TPoint  p) {
    return (float)sqrt((x - p.X) * (x - p.X) + (y - p.Y) * (y - p.Y));
}
int main() {
    for (int i = 0; i < 5; i++)
    {
        for (int j = i + 1; j < 5; j++)
        {
            for (int k = j + 1; k < 5; k++)
            {
                pIn = 0;
                pOut = 0;
                A = p[i].X*p[i].X;
                B = p[i].Y*p[i].Y;
                C = p[j].X*p[j].X;
                D = p[j].Y*p[j].Y;
                E = p[k].X*p[k].X;
                F = p[k].Y*p[k].Y;
                G = p[i].Y*p[i].Y;
                x = -(p[i].Y*(C + D - E - F) + p[j].Y*(E + F - A - B) + p[k].Y*(A + B - C - D)) / (2 * (p[i].X*(p[j].Y - p[k].Y) + p[j].X*(p[k].Y - p[i].Y) + p[k].X*(p[i].Y - p[j].Y)));
                y = (p[i].X*(C + D - E - F) + p[j].X*(E + F - A - B) + p[k].X*(A + B - C - D)) / (2 * (p[i].X*(p[j].Y - p[k].Y) + p[j].X*(p[k].Y - p[i].Y) + p[k].X*(p[i].Y - p[j].Y)));
                radius = r(x, y, p[j]);
                for (int l = 0; l < 5; l++)
                {
                    if (l != i && l != j && l != k)
                    {
                        if (r(x, y, p[l]) > radius)
                            pOut++;
                        else
                            pIn++;
                    }
                }
                printf("%i %i %i %i %6.2f %6.2f %6.2f\n", i, j, k, abs(pIn - pOut), radius, x, y);
                if (abs(pIn - pOut) < d || (abs(pIn - pOut) == d && R > radius))
                {
                    d = abs(pIn - pOut);
                    X = x;
                    Y = y;
                    R = radius;
                    m = i;
                    n = j;
                    o = k;
                }
            }
        }
    }
    printf("%6.2f%6.2f%6.2f\n", X, Y, R);
    printf("%i %i %i %i\n", m, n, o, d);
    system("pause");
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2019, 23:47

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

Определить радиус и центр окружности, проходящей по крайней мере через три различные точки
11. Определить радиус и центр окружности, проходящей по крайней мере через три различные точки...

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


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

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

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