1 / 1 / 0
Регистрация: 01.11.2016
Сообщений: 4
1

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

05.11.2017, 15:53. Показов 9514. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра.

Суть задачи:
Пусть вершины A(xA; yA; zA), B(xB; yB; zB), C(xC; yC; zC).
Тогда периметр треугольника найдется как сумма длин сторон ВА, BC, CA:
P = |ВА| + |BC| + |CA| =корень((xA – xB)^2 + (yA – yB)^2 + (zA – zB)^2) +
+ корень( (xC – xB)^2 + (yC – yB)^2 + (zC – zB)^2 ) +
+ корень( (xA – xC)^2 + (yA – yC)^2 + (zA – zC)^2 );

Решение можно найти полным перебором всех возможных комбинаций A, B, C.

Проблема в коде на Java: Периметр всегда получается 0, из вложенного цикла он берёт последнюю точку и вычитает её саму из себя, когда ищет длину отрезка
Он правильно пишет в массив, но неправильно читает из массива
Если в любом месте программы написать gets(0) и gets(1), то он выведет одинаковые элементы
Помогите, пожалуйста, добрые люди)


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
import java.awt.geom.*;
import java.util.*; 
public class perim { 
 
     public static void main(String[] args) { 
         //массив с точками с координатами x и y 
         ArrayList<Point2D.Double> list = new ArrayList<>(); 
         Scanner sc = new Scanner(System.in); // для считывания значения с клавиатуры 
         Random r = new Random(); // для заполнения рандомом 
         Point2D.Double p = new Point2D.Double(); 
         //Просим юзера ввести, сколько точек будет в массиве 
         System.out.print("Введите число точек, которые будут составлять множество: "); 
         int size = sc.nextInt(); 
         //заполняем их случайными значениями 
               for (int i = 0; i < size; i++) { 
                   p.x = r.nextDouble()*10; 
                   p.y = r.nextDouble()*10; 
                   list.add(p); 
               System.out.print("\n " + p.x + "," + p.y); 
              } 
         System.out.println(); 
         double max = 0; 
         for(int i=0; i<size; i++) 
             for(int j=0; j<size; j++) 
                 for(int k=0; k<size; k++) 
                     { 
                     double xi = list.get(i).x, xj = list.get(j).x, xk = list.get(k).x; 
                     double yi = list.get(i).y, yj = list.get(j).y, yk = list.get(k).y; 
                     double t1=Math.pow(xi-xj, 2) + Math.pow(yi-yj, 2); 
                     t1 = Math.sqrt(t1); 
                     double t2=Math.pow(xi-xk, 2) + Math.pow(yi-yk, 2); 
                     t2 = Math.sqrt(t2); 
                     double t3=Math.pow(xk-xj, 2) + Math.pow(yk-yj, 2); 
                     t3 = Math.sqrt(t3); 
                     if(t1+t2<t3 && t1+t3<t2 && j+k<i && t2+t3+t1>max) max = t1+t2+t3; 
                     } 
         System.out.print("\nP = "+ max); 
         }
     }
Также есть код на C++, может кому-то поможет он:
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
#include<math.h>
//только для использования sqrt;
 
#include<iostream>
using namespace std;
 
double d(double *p1, double *p2)// возвращает расстояние между точками p1 p2
{
    double dx2,dy2,dz2; //dx2 = (Xa - Xb)^2
    dx2 = (p1[0]-p2[0])*(p1[0]-p2[0]);
    dy2 = (p1[1]-p2[1])*(p1[1]-p2[1]);
    dz2 = (p1[2]-p2[2])*(p1[2]-p2[2]);
    return sqrt(dx2+dy2+dz2);
}
 
int main()
{
    //инициализация массива случайной размерности:
    srand( time(NULL) );
    int dimm = rand()%100+3;//размерность не меньше трёх.
    cout<<"\ndimm = "<<dimm<<endl;
    double** m = new double* [dimm];
    for (int i = 0;i<dimm;i++) m[i] = new double [3];
    
    //Заполним его случайными координатами в диапазоне от -1 до 1:
    for (int i = 0;i<dimm;i++)
    {
        m[i][0] = double(rand()%200 - 100)/100; //x from -1 to +1;
        m[i][1] = double(rand()%200 - 100)/100; //y from -1 to +1;
        m[i][2] = double(rand()%200 - 100)/100; //z from -1 to +1;          
    }
    // ниже идёт описание вспомогательных переменных:
    //p = perimetr ab,bc,ca = distance; a,b,c = points;
    double p = 0;
    double ab,bc,ca; ab = bc = ca = 0;
    int a,b,c; a = b = c = 0;
    
    // Все приготовления завершены, можно приступить к поиску решения:
    for(int ia=0;ia<dimm;ia++)
    {
        for(int ib=0;ib<dimm;ib++)
        {
            for(int ic=0;ic<dimm;ic++)
            {
                ab = d(m[ia],m[ib]);
                bc = d(m[ib],m[ic]);
                ca = d(m[ic],m[ia]);
                if(ab+bc+ca > p) // если верно, то найден новый максимальный периметр
                {
                    p = ab+bc+ca;
                    cout<<"new max p = "<<p<<endl;//можно закомментировать строку.
                    a = ia;
                    b = ib;
                    c = ic;
                }
            }
        }
    }
    // Решение найдено, осталось только вывести его куда-нибудь.
    
    cout<<"\n\nmax P = "<<p<<endl;
    cout<<"\t"<<"\tx"<<"\t\ty"<<"\t\tz"<<endl;
    cout<<" points A\t"<<m[a][0]<<"\t\t"<<m[a][1]<<"\t\t"<<m[a][2]<<"\t\t"<<endl;
    cout<<" points B\t"<<m[b][0]<<"\t\t"<<m[b][1]<<"\t\t"<<m[b][2]<<"\t\t"<<endl;
    cout<<" points C\t"<<m[c][0]<<"\t\t"<<m[c][1]<<"\t\t"<<m[c][2]<<"\t\t"<<endl;       
            
 
    system("pause");
        //Освобождение памяти:
    for (int i = 0;i<dimm;i++) delete m[i];
    delete m;            
    return 0;
}
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2017, 15:53
Ответы с готовыми решениями:

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

Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра
Задание, как множество точек вывести на экран понял. #include &lt;iostream&gt; #include &lt;time.h&gt;...

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

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

3
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
06.11.2017, 19:34 2
Могу помочь, если помощь ещё нужна
0
1 / 1 / 0
Регистрация: 01.11.2016
Сообщений: 4
06.11.2017, 20:03  [ТС] 3
Да, еще нужна)
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
07.11.2017, 01:01 4
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
117
118
119
120
121
122
123
124
125
126
127
import com.sun.org.apache.xpath.internal.SourceTree;
 
import java.util.Arrays;
import java.util.Random;
 
public class MaxPerimeter {
    private static final int LENGTH = 8;
    private static final double MIN_RANGE = -2.0;
    private static final double MAX_RANGE = 2.0;
 
    public static void main(String[] args) {
        Point3D[] array = fillRandomArrayPoint(LENGTH, MIN_RANGE, MAX_RANGE);
        System.out.println("Массив точек: " + Arrays.toString(array) + "\n");
 
        if (LENGTH >= 3) {
            double maxPerimeter = 0;
            Triangle triangle = null;
            for (int i = 0; i < LENGTH - 2; i++) {
                for (int j = i + 1; j < LENGTH - 1; j++) {
                    for (int k = j + 1; k < LENGTH; k++) {
                        Triangle temp = new Triangle(array[i], array[j], array[k]);
                        double perimeter = temp.getPerimeter();
                        if (maxPerimeter < perimeter) {
                            //System.out.println(temp); раскомментируй, если хочешь видеть информацию о всех треугольниках
                            maxPerimeter = perimeter;
                            triangle = temp;
                        }
                    }
                }
            }
            System.out.println("Ответ:\n" + triangle);
        } else {
            System.out.println("Ответ:\nРешения нет, т.к. точек в массиве меньше 3-х!");
        }
    }
 
    public static Point3D[] fillRandomArrayPoint(int length, double min, double max) {
        Point3D[] array = length > 0 ? new Point3D[length] : new Point3D[0];
        if (length > 0) {
            for (int i = 0; i < length; i++) {
                array[i] = randomPoint(min, max);
            }
        }
        return array;
    }
 
    public static Point3D randomPoint(double min, double max) {
        Random rand = new Random();
        double x = rand.nextDouble() * (max - min) + min;
        double y = rand.nextDouble() * (max - min) + min;
        double z = rand.nextDouble() * (max - min) + min;
        return new Point3D(x, y, z);
    }
}
 
class Triangle {
    Point3D a;
    Point3D b;
    Point3D c;
 
    public Triangle(Point3D a, Point3D b, Point3D c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
 
    public double sideAB() {
        return this.a.distanceTo(this.b);
    }
 
    public double sideBC() {
        return this.b.distanceTo(this.c);
    }
 
    public double sideAC() {
        return this.a.distanceTo(this.c);
    }
 
    public double getPerimeter() {
        return sideAB() + sideAC() + sideBC();
    }
 
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Точки треугольника: ").append(String.format("%s, %s, %s;", this.a, this.b, this.c)).append("\n");
        sb.append("Длинны сторон треугольника: ").append(String.format("%.3f, %.3f, %.3f;", sideAB(), sideBC(), sideAC())).append("\n");
        sb.append("Периметр треугольника: ").append(String.format("%.3f;", getPerimeter())).append("\n");
        return sb.toString();
    }
}
 
class Point3D {
    private double x;
    private double y;
    private double z;
 
    public double getX() {
        return x;
    }
 
    public double getY() {
        return y;
    }
 
    public double getZ() {
        return z;
    }
 
    Point3D(double x, double y, double z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
 
    @Override
    public String toString() {
        return String.format("[%.3f, %.3f, %.3f]", this.x, this.y, this.z);
    }
 
    public double distanceTo(Point3D point) {
        double x = Math.pow(point.getX() - this.x, 2);
        double y = Math.pow(point.getY() - this.y, 2);
        double z = Math.pow(point.getZ() - this.z, 2);
        return Math.sqrt(x + y + z);
    }
}
Добавлено через 12 минут
Если будешь раскомментировать строчку для вывода всех треугольников, то есть недочёт, а именно:

из строчки 24 эту строку:
//System.out.println(temp); раскомментируй, если хочешь видеть информацию о всех треугольниках
перенеси между строками 22 23

должно быть:
...
Triangle temp = new Triangle(array[i], array[j], array[k]);
double perimeter = temp.getPerimeter();
System.out.println(temp);
if (maxPerimeter < perimeter) {
...
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru