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

Пояснить реализацию алгоритма отсечения

14.05.2019, 14:07. Показов 1351. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добавьте,пожалуйста, немного поясняющих комментариев, что делает каждый из блоков. Нужно разобраться для доклада.
Кликните здесь для просмотра всего текста
Matlab M
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
n = 100;
Xmin = -4; Xmax = 4;
Ymin = -3; Ymax = 3;
 
figure; hold on;
 
P1x = rand(1,n)*20 - 10;  
P2x = rand(1,n)*20 - 10;
P1y = rand(1,n)*20 - 10;  
P2y = rand(1,n)*20 - 10;
P1code = zeros(n,4);
P2code = zeros(n,4);
 
for i = 1:n    
 
    if P1x(i) < Xmin
        P1code(i,1) = 1;
    end
    if P1x(i) > Xmax
        P1code(i,2) = 1;
    end
    if P1y(i) < Ymin
        P1code(i,3) = 1;
    end
    if P1y(i) > Ymax
        P1code(i,4) = 1;
    end    
 
    if P2x(i) < Xmin
        P2code(i,1) = 1;
    end
    if P2x(i) > Xmax
        P2code(i,2) = 1;
    end
    if P2y(i) < Ymin
        P2code(i,3) = 1;
    end
    if P2y(i) > Ymax
        P2code(i,4) = 1;
    end
 
    plot([P1x(i),P2x(i)],[P1y(i),P2y(i)],'b-');
end
hold off;
 
P_label = zeros(1,n);
figure; hold on;
for i = 1:n
    P_or = P1code(i,1:4) | P2code(i,1:4);
    if sum(P_or) == 0
        P_label(i) = 1;
        plot([P1x(i),P2x(i)],[P1y(i),P2y(i)],'r-');
    end
    P_and = P1code(i,1:4) & P2code(i,1:4);
    if sum(P_and) > 0
        P_label(i) = 2;
        plot([P1x(i),P2x(i)],[P1y(i),P2y(i)],'g-');
    end
end
hold off;
 
figure; hold on;
for i = 1:n
    if P_label(i) == 0
 
        P_or = P1code(i,1:4) | P2code(i,1:4);
        plot([P1x(i),P2x(i)],[P1y(i),P2y(i)],'g-');
 
        if P_or(1) == 1
            Py = P1y(i) + (Xmin-P1x(i))*(P2y(i)-P1y(i))/(P2x(i)-P1x(i));
            if P1x(i) < Xmin
                P1x(i) = Xmin; P1y(i) = Py;
            elseif P2x(i) < Xmin
                P2x(i) = Xmin; P2y(i) = Py;
            end            
        end
 
        if P_or(2) == 1
            Py = P1y(i) + (Xmax-P1x(i))*(P2y(i)-P1y(i))/(P2x(i)-P1x(i));
            if P1x(i) > Xmax
                P1x(i) = Xmax; P1y(i) = Py;
            elseif P2x(i) > Xmax
                P2x(i) = Xmax; P2y(i) = Py;
            end            
        end
 
        if P_or(3) == 1
            Px = P1x(i) + (Ymin-P1y(i))/(P2y(i)-P1y(i))*(P2x(i)-P1x(i));
            if P1y(i) < Ymin
                P1x(i) = Px; P1y(i) = Ymin;
            elseif P2y(i) < Ymin
                P2x(i) = Px; P2y(i) = Ymin;
            end            
        end
 
        if P_or(4) == 1
            Px = P1x(i) + (Ymax-P1y(i))/(P2y(i)-P1y(i))*(P2x(i)-P1x(i));
            if P1y(i) > Ymax
                P1x(i) = Px; P1y(i) = Ymax;
            elseif P2y(i) > Ymax
                P2x(i) = Px; P2y(i) = Ymax;
            end            
        end
        if P1x(i) >= Xmin & P1x(i) <= Xmax & ...
                P2x(i) >= Xmin & P2x(i) <= Xmax & ...
                P1y(i) >= Ymin & P1y(i) <= Ymax & ...
                P2y(i) >= Ymin & P2y(i) <= Ymax
            plot([P1x(i),P2x(i)],[P1y(i),P2y(i)],'m-','LineWidth',2);
        end
        plot([-4 4 4 -4 -4],[-3 -3 3 3 -3],'b-','LineWidth',2);
    end
end
hold off;


https://blog.csdn.net/soulmeetliang/article/details/79179350
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2019, 14:07
Ответы с готовыми решениями:

Написать реализацию муравьиного алгоритма
написать реализацию муравьиного алгоритма Правила: 5.18. Запрещено размещать задания и решения в...

Исправить реализацию алгоритма Краскала
/***************************************************************** * File : Kruskal.cs * ...

Выкладываю реализацию алгоритма Дейкстры на С++
Дпанная программа выполняет поиск по заданной матрице весов. Далее указываем начальную точку в...

Ищу реализацию алгоритма zip 2.0
Есть zip архив, в архиве файлы xD имена файлов зашифрованы алгоритмом Zip 2.0. Ключ есть. Может...

6
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
14.05.2019, 19:42 2
Насколько хорошо должен работать код?
Пояснить реализацию алгоритма отсечения
0
416 / 200 / 69
Регистрация: 20.01.2019
Сообщений: 713
14.05.2019, 21:21 3
toypypp, Правильно я понимаю, что ты где-то стырил код и хочешь его где-то представить как свой в виде доклада, но не понимаешь как он работает?
0
0 / 0 / 6
Регистрация: 04.10.2016
Сообщений: 110
16.05.2019, 13:40  [ТС] 4
Ну я даже ссылку указал откуда взял
0
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
16.05.2019, 14:54 5
Я сделал
Кликните здесь для просмотра всего текста
Matlab M
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
clc,clear
 
n = 20;                    % количество отрезков
    % границы области
% t = linspace(0,2*pi,5)+pi/4;
% xv = 8*cos(t);
% yv = 6*sin(t);
xv = [-4 -4 4 4 -4];
yv = [-3 3 3 -3 -3];
 
    % генерируем точки отрезков в границах -10 : 10
a = 20;
x1 = rand(1,n)*a - a/2;  
x2 = rand(1,n)*a - a/2;
y1 = rand(1,n)*a - a/2;  
y2 = rand(1,n)*a - a/2;
 
    % точки пересечения отрезков и границ области
CR = false(1,n);
[xc1,xc2,yc1,yc2] = deal( zeros(1,n) );
for i = 1:n
        % отрезок
    x = [x1(i) x2(i)];
    y = [y1(i) y2(i)];
    [xc,yc] = polyxpoly(x,y,xv,yv);
    if ~isempty(xc)            % если точки пересечения есть
        CR(i) = true;
        xc1(i) = xc(1);        % первая точка пересечения
        yc1(i) = yc(1);
        if length(xc) == 2     % если точек - две
            xc2(i) = xc(2);
            yc2(i) = yc(2);
        else                   % если точка одна, определяем 
                               % какая из точек отрезка 
                               % находится внутри области
            if inpolygon(x1(i),y1(i),xv,yv)
                xc2(i) = x1(i);
                yc2(i) = y1(i);
            else
                xc2(i) = x2(i);
                yc2(i) = y2(i);
            end
        end
    end
end
 
in1 = inpolygon(x1,y1,xv,yv);
in2 = inpolygon(x2,y2,xv,yv);
IN  = in1 & in2;                % отрезки находяющиемя внутри
OUT = ~(IN | CR);            % отрезки находяющиемя снаружи
 
plot(xv, yv, 'b-','LineWidth',2);                   % границы области
hold on
plot([x1; x2], [y1; y2],'g')                        % все отрезки
plot([xc1(CR); xc2(CR)], [yc1(CR); yc2(CR)],'r')    % пересекающие
plot([x1(IN);   x2(IN)], [y1(IN);   y2(IN)],'k')    % внутри
plot([x1(OUT); x2(OUT)], [y1(OUT); y2(OUT)],'b')    % снаружи
hold off
0
0 / 0 / 6
Регистрация: 04.10.2016
Сообщений: 110
18.05.2019, 10:32  [ТС] 6
nuHrBuH, спасибо большое! можете прислать результат? Не могу запустить без mapping toolbox, а в пробной версии matlab не устанавливается.
0
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
18.05.2019, 13:40 7
Лучший ответ Сообщение было отмечено toypypp как решение

Решение

Странно, это из-за inpolygon() и polyxpoly()?

Измененный код:
Кликните здесь для просмотра всего текста
Matlab M
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
clc,clear
 
n = 50;                    % количество отрезков
    % границы области
% t = linspace(0,2*pi,5)+pi/4;
% xv = 8*cos(t);
% yv = 6*sin(t);
xv = [-4 -4 4 4 -4]';
yv = [-3 3 3 -3 -3]';
 
    % генерируем точки отрезков в границах -10 : 10
a = 20;
x1 = rand(n,1)*a - a/2;  
x2 = rand(n,1)*a - a/2;
y1 = rand(n,1)*a - a/2;  
y2 = rand(n,1)*a - a/2;
 
    % точки пересечения отрезков и границ области
CR = false(n,1);
[xc1,xc2,yc1,yc2] = deal( zeros(n,1) );
for i = 1:n
        % отрезок
    x = [x1(i) x2(i)];
    y = [y1(i) y2(i)];
    [xc,yc] = intersections(x,y,xv,yv);
    if ~isempty(xc)            % если точки пересечения есть
        CR(i) = true;
        xc1(i) = xc(1);        % первая точка пересечения
        yc1(i) = yc(1);
        if length(xc) == 2     % если точек - две
            xc2(i) = xc(2);
            yc2(i) = yc(2);
        else                   % если точка одна, определяем 
                               % какая из точек отрезка 
                               % находится внутри области
            if inpoly2([x1(i) y1(i)],[xv yv])
                xc2(i) = x1(i);
                yc2(i) = y1(i);
            else
                xc2(i) = x2(i);
                yc2(i) = y2(i);
            end
        end
    end
end
 
in1 = inpoly2([x1 y1],[xv yv]);
in2 = inpoly2([x2 y2],[xv yv]);
IN  = in1 & in2;                % отрезки находяющиемя внутри
OUT = ~(IN | CR);            % отрезки находяющиемя снаружи
 
plot(xv, yv, 'b-','LineWidth',2);                   % границы области
hold on
plot([x1 x2]', [y1 y2]','g')                        % все отрезки
plot([xc1(CR) xc2(CR)]', [yc1(CR) yc2(CR)]','r')    % пересекающие
plot([x1(IN)   x2(IN)]', [y1(IN)   y2(IN)]','k')    % внутри
plot([x1(OUT) x2(OUT)]', [y1(OUT) y2(OUT)]','b')    % снаружи
hold off


Скачать аналог inpolygon(): inpoly2()
Скачать аналог polyxpoly(): intersections()

Добавлено через 1 минуту
Медленно считает, што поделать
1
18.05.2019, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2019, 13:40
Помогаю со студенческими работами здесь

Исправить реализацию алгоритма Дейкстры
Подскажите пожалуйста новичку, как подставлять начальную и конечную точку графа, а точнее сделать...

Пояснить суть алгоритма поиска с возвратом
Здравствуйте) Ни как не могу понять &quot;смысл&quot; алгоритма с возвратом... :( Какая у него функция? может...

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

Выполнить программную реализацию алгоритма ГОСТ 28147
Товарищи программисты,помогите с заданием! Выполнить программную реализацию алгоритма ГОСТ...


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

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

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