Форум программистов, компьютерный форум CyberForum.ru

Сместить на плоскости три точки с определенной закономерностью - C++

Восстановить пароль Регистрация
 
nvek
2 / 2 / 0
Регистрация: 18.09.2014
Сообщений: 87
01.10.2015, 22:22     Сместить на плоскости три точки с определенной закономерностью #1
Точки задаются координатами (x1, y1),
(x2, y2) соответственно. При смене
координат одной точки, координаты
другой точки меняются по принципу:

fi = atan((y12-y1)/(x12-x1))
x22= L cos(fi) + x12
y22=L sin (fi) + y12
расстояние между точками не меняется,
смещение другой точки минимально.
Формулы для использования:где x12, y12 новые координаты точки1, x22,
y22 новые координаты точки2, L – длина
отрезка.
Аналогично при смене координат
точка2

вот само задание. Над поставить третью точку. у13 и х13 но!
у меня последне плече разворачивает куда не надо
там связано с тангенсом и арктангенсом, при любой координате, у меня тангенс будет идти на положительную сторону вверхправо
этого недолжно быть
запустите мою программу и посмотрите если не понимаете
C++ (Qt)
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
#include <math.h>
#include <iostream>
 
using namespace std;
 
class Otrezok
{
protected:
    double x1, x2;
    double y1, y2;
    double L;
    double fi;
public:
    Otrezok(int x1, int y1, int x2, int y2)
    {
        //проверка
        if ((x1 <= 1000) || (x1 >= 0))
            this->x1 = x1;
        else this->x1 = 0;
        if ((x2 <= 1000) || (x2 >= 0))
            this->x2 = x2;
        else this->x2 = 0;
        if ((y1 <= 500) || (y1 >= 0))
            this->y1 = y1;
        else this->y1 = 0;
        if ((y2 <= 500) || (y2 >= 0))
            this->y2 = y2;
        else this->y2 = 0;
        ////////////////////////////////////
        L = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); //Dlina
    } 
    void oMethod(int x12, int y12)
    {
        //тело метода
 
        fi = atan2((y12 - y2) , (x12 - x2));
        x2 = L*cos(fi) + x12;
        y2 = L*sin(fi) + y12; 
        cout << fi;
    }
    int getX2() { return x2; }
//  int getX3() { return x3; }
    int getY2() { return y2; }
//  int getY3() { return y3; }
    
};
class Lomanaya : public Otrezok
{
private:
    double x3, y3;
    double L;
    double fi;
public:
    Lomanaya(int x1, int y1, int x2, int y2, int x3, int y3) : Otrezok(x1, y1, x2, y2) //нашли длину для
        //отрезка
    {
        //прверили другие точки
        if ((x3 <= 1000) || (x3 >= 0))
            this->x3 = x3;
        else this->x3 = 0;
        if ((y3 <= 1000) || (y3 >= 0))
            this->y3 = y3;
        else this->y3 = 0;
        //////////////////////////////////////
        //измерим отрезок для последней точки
        L = sqrt((x3 - x2)*(x3 - x2) + (y3 - y2)*(y3 - y2));
        
 
    }
    
    void lMethod(int x12, int y12)
    {
        
        oMethod(x12, y12);
        
        fi = atan2((y3 - y2) ,(x3 - x2));
        x3 = L*cos(fi) + x2;
        y3 = L*sin(fi) + y2;
 
    }
    int getX3() { return x3; }
    int getY3() { return y3; }
};
 
void main()
{
    
    Otrezok a(3, 2, 9, 4);//создали линию
    Lomanaya b(3, 2, 9, 4, 10, 3);
    int x12 = 4;
    int y12 = 3;
    //a.method(x12, y12);
    b.lMethod(x12, y12);
    //cout <<  << endl;
 
    cout << "[" << b.getX2() << ":" << b.getY2() << "]" << "  [" << b.getX3() << ":" << b.getY3() << "]" << endl;
    system("pause");
    //return 0;
    //выводим точки
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2015, 22:22     Сместить на плоскости три точки с определенной закономерностью
Посмотрите здесь:

C++ Из заданного на плоскости множества точек выбрать три различные точки
C++ Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра
Найдите центр и радиус окружности, проходящей через три заданные точки на плоскости. C++
Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...) C++
Из заданного множества точек на плоскости выбрать три разные точки A, B, C C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Barrent
 Аватар для Barrent
211 / 87 / 27
Регистрация: 04.05.2013
Сообщений: 260
Завершенные тесты: 1
01.10.2015, 22:30     Сместить на плоскости три точки с определенной закономерностью #2
В код не вникал, но вы в курсе, что тригонометрические стандартные функции в качестве параметра принимают радианы, а не градусы?
nvek
2 / 2 / 0
Регистрация: 18.09.2014
Сообщений: 87
02.10.2015, 08:47  [ТС]     Сместить на плоскости три точки с определенной закономерностью #3
ну так а атан2 разве не радианы выдает?
Barrent
 Аватар для Barrent
211 / 87 / 27
Регистрация: 04.05.2013
Сообщений: 260
Завершенные тесты: 1
02.10.2015, 12:45     Сместить на плоскости три точки с определенной закономерностью #4
Не совсем понятно назначение вашей функции oMethod. Как я понимаю, при изменении точки 1 вторая точка переносится таким образом, чтобы сохранить угол и длину отрезка.
В таком случае код должен быть таким:
C++
1
2
3
4
5
6
7
8
9
void oMethod(int x12, int y12)
    {
        fi = atan((y1 - y2) / (x1 - x2));
        x1 = x12;
        y1 = y12;
        x2 = L*cos(fi) + x12;
        y2 = L*sin(fi) + y12;   
 
    }
то же самое касается и функции lMethod
nvek
2 / 2 / 0
Регистрация: 18.09.2014
Сообщений: 87
02.10.2015, 13:37  [ТС]     Сместить на плоскости три точки с определенной закономерностью #5
первое плечо я сделал по формулам. написал метод. в методе для ломаной я вызвал метод для плеча 1 раз потом нашел х2 у2. но вот в чем проблема. когда я меняю третью точку плечо поварачивается совершенно в другую сторону допустим вместо 1 четверти во вторую

Добавлено через 3 минуты
можно ли сделать, чтобы я в методе для ломаной вызывал два раза метод для отрезка?
Barrent
 Аватар для Barrent
211 / 87 / 27
Регистрация: 04.05.2013
Сообщений: 260
Завершенные тесты: 1
02.10.2015, 14:15     Сместить на плоскости три точки с определенной закономерностью #6
Если я вообще правильно понял задачу:
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
#include "stdafx.h"
#include <math.h>
#include <iostream>
 
using namespace std;
 
class Otrezok
{
protected:
    double x1, x2;
    double y1, y2;
    double L;
    double fi;
public:
    Otrezok(int x1, int y1, int x2, int y2)
    {
        //проверка
        if ((x1 <= 1000) || (x1 >= 0))
            this->x1 = x1;
        else this->x1 = 0;
        if ((x2 <= 1000) || (x2 >= 0))
            this->x2 = x2;
        else this->x2 = 0;
        if ((y1 <= 500) || (y1 >= 0))
            this->y1 = y1;
        else this->y1 = 0;
        if ((y2 <= 500) || (y2 >= 0))
            this->y2 = y2;
        else this->y2 = 0;
        ////////////////////////////////////
        L = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); //Dlina
    }
    void oMethod(int x12, int y12)
    {
        //тело метода
        fi = atan((y1 - y2) / (x1 - x2));
        x1 = x12;
        y1 = y12;
        x2 = L*cos(fi) + x12;
        y2 = L*sin(fi) + y12;
    }
    int getX1() { return x1; }
    int getX2() { return x2; }
    int getY1() { return y1; }
    int getY2() { return y2; }
};
class Lomanaya : public Otrezok
{
private:
    double x3, y3;
    double L;
    double fi;
public:
    Lomanaya(int x1, int y1, int x2, int y2, int x3, int y3) : Otrezok(x1, y1, x2, y2) //нашли длину для
                                                                                       //отрезка
    {
        //прверили другие точки
        if ((x3 <= 1000) || (x3 >= 0))
            this->x3 = x3;
        else this->x3 = 0;
        if ((y3 <= 1000) || (y3 >= 0))
            this->y3 = y3;
        else this->y3 = 0;
        //////////////////////////////////////
        //измерим отрезок для последней точки
        L = sqrt((x3 - x2)*(x3 - x2) + (y3 - y2)*(y3 - y2));
    }
 
    void lMethod(int x12, int y12)
    {
        fi = atan((y3 - y2) / (x3 - x2));
        oMethod(x12, y12);      
        x3 = L*cos(fi) + x2;
        y3 = L*sin(fi) + y2;
 
    }
    int getX3() { return x3; }
    int getY3() { return y3; }
};
 
void main()
{
    Lomanaya b(3, 2, 9, 4, 10, 3);
    int x12 = 4;
    int y12 = 4;
    cout << "[" << b.getX1() << ":" << b.getY1() << "]" << "  [" << b.getX2() << ":" << b.getY2() << "]" << "  [" << b.getX3() << ":" << b.getY3() << "]" << endl;
    b.lMethod(x12, y12);
    cout << "[" << b.getX1() << ":" << b.getY1() << "]" << "  [" << b.getX2() << ":" << b.getY2() << "]" << "  [" << b.getX3() << ":" << b.getY3() << "]" << endl;
 
    system("pause");
}
Для того, чтобы обойтись 1 методом, нужно в Ломаной хранить отрезки в виде массива и при изменении 1 точки в цикле по цепочке менять весь массив.
Еще можно хранить отрезки в виде двунаправленного списка. В этом случае при вызове метода обновления координат отрезка, он будет сообщать соседям о необходимости обновления.
nvek
2 / 2 / 0
Регистрация: 18.09.2014
Сообщений: 87
02.10.2015, 14:54  [ТС]     Сместить на плоскости три точки с определенной закономерностью #7
как мне сделать 2 вариант?
Barrent
 Аватар для Barrent
211 / 87 / 27
Регистрация: 04.05.2013
Сообщений: 260
Завершенные тесты: 1
02.10.2015, 20:00     Сместить на плоскости три точки с определенной закономерностью #8
Сделал первый вариант:

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
#include <vector>
#include <math.h>
#include <sstream>
 
using namespace std;
 
const float PI = 3.14159;
 
class Point {
public:
    int x;
    int y;
    Point(int x, int y) {
        this->x = x;
        this->y = y;
    }
    Point() {
        x = 0;
        y = 0;
    }
    Point(Point& P) {
        x = P.x;
        y = P.y;
    }
};
//============================================================
class Line {
    //VARIABLES
public:
    Point A;            //point 1
    Point B;            //point 2
 
    //CONSTRUCTORS
public:
    Line(Point P1, Point P2) {
        A = P1;
        B = P2;
    }
 
    //METHODS
public:
    //Перемещение относительно точки А
    void MoveA(Point newA) {
        float L = sqrt((B.x - A.x)*(B.x - A.x) + (B.y - A.y)*(B.y - A.y));
        float fi = atan2((B.y - A.y), (B.x - A.x));
 
        A = newA;
        //1-й квадрант
        if (fi >= 0 && fi < PI / 2) {
            B.x = round(L*cos(fi) + A.x);
            B.y = round(L*sin(fi) + A.y);
        }
        //2-й квадрант
        if (fi >= PI / 2 && fi <= PI) {
            B.x = round(-L*sin(PI - fi) + A.x);
            B.y = round(L*cos(PI - fi) + A.y);
        }
        //4-й квадрант
        if (fi < 0 && fi >= -PI / 2) {
            B.x = round(L*cos(abs(fi)) + A.x);
            B.y = round(- L*sin(abs(fi)) + A.y);
        }
        //3-й квадрант
        if (fi < -PI / 2 && fi >= -PI) {
            B.x = round(-L*cos(PI + fi) + A.x);
            B.y = round(-L*sin(PI + fi) + A.y);
        }
        
    }
    //Перемещение относительно точки B
    void MoveB(Point newB) {
        //Способ 1
        float L = sqrt((B.x - A.x)*(B.x - A.x) + (B.y - A.y)*(B.y - A.y));
        float fi = atan2((A.y - B.y), (A.x - B.x)); 
        
        B = newB;
        //1-й квадрант
        if (fi >= 0 && fi < PI / 2) {
            A.x = round(L*cos(fi) + B.x);
            A.y = round(L*sin(fi) + B.y);
        }
        //2-й квадрант
        if (fi >= PI / 2 && fi <= PI) {
            A.x = round(-L*sin(PI - fi) + B.x);
            A.y = round(L*cos(PI - fi) + B.y);
        }
        //4-й квадрант
        if (fi < 0 && fi >= -PI / 2) {
            A.x = round(L*cos(abs(fi)) + B.x);
            A.y = round(-L*sin(abs(fi)) + B.y);
        }
        //3-й квадрант
        if (fi < -PI / 2 && fi >= -PI) {
            A.x = round(-L*cos(PI + fi) + B.x); 
            A.y = round(-L*sin(PI + fi) + B.y);
        }
        cout << (PI + fi) * 180 / PI << endl;
    }
 
    string ToString() {
        std::stringstream ss;
        ss << "[(" << A.x << ", " << A.y << "), (" << B.x << ", " << B.y << ")]";
        return ss.str();
    }
};
//============================================================
class PolyLine {
    //VARIABLES
    vector<Line*> lines;
 
    //METHODS
public:
    void AddLine(Point P1, Point P2) {
        lines.push_back(new Line(P1, P2));
    }
    void Print() {
        for(Line* line: lines)
            cout << '\t' << line->ToString();
        cout << endl;
    }
    //переместить точку А указанного отрезка по новым координатам
    bool MoveA(int line_index, Point& A) {
        if (line_index < 0 || line_index >= lines.size())
            return false;
        lines[line_index]->MoveA(A);
        CallNeightboors(line_index);
        return true;
    }
    //переместить точку Б указанного отрезка по новым координатам
    bool MoveB(int line_index, Point& B) {
        if (line_index < 0 || line_index >= lines.size())
            return false;
        lines[line_index]->MoveB(B);
        CallNeightboors(line_index);
        return true;
    }
 
private:
    //Сообщить остальным отрезкам о переносе
    void CallNeightboors(int line_index) {
        auto current = lines.begin();
        for (int i = 0; i < line_index; current++, i++);
        Point P;
        //сдвиг предыдущих      
        for (auto iter = current; iter != lines.begin(); ) {
            P = (*iter)->A;
            iter--;
            (*iter)->MoveB(P);
            P = (*iter)->A;
        }
 
        //сдвиг следующих
        for (auto iter = current; ; ) {
            P = (*iter)->B;
            iter++;
            if (iter == lines.end())
                break;
            (*iter)->MoveA(P);
            P = (*iter)->B;
        }
    }
};
 
int main()
{
    PolyLine poly1;
    poly1.AddLine(Point(-3, -2), Point(9, 4));
    poly1.AddLine(Point(9, 4), Point(-10, -3));
    poly1.AddLine(Point(-10, -3), Point(0, 0));
    cout << "PolyLine1:" << endl;
    poly1.Print();
    poly1.MoveA(1, Point(4, 3));
    cout << "PolyLine1:" << endl;
    poly1.Print();
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 11:40     Сместить на плоскости три точки с определенной закономерностью
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
nvek
2 / 2 / 0
Регистрация: 18.09.2014
Сообщений: 87
10.11.2015, 11:40  [ТС]     Сместить на плоскости три точки с определенной закономерностью #9
конечно странный вопрос, а если мне сделать через наследование и без поинтАБ?
Yandex
Объявления
10.11.2015, 11:40     Сместить на плоскости три точки с определенной закономерностью
Ответ Создать тему
Опции темы

Текущее время: 21:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru