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

Лучевой алгоритм трассировки

16.01.2020, 01:05. Показов 3931. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую вас, коллеги, встал такой вопрос. Нужна реализация лучевого алгоритма трассировки на c++ или c#, но нигде нету информации по этому поводу. Может я плохо искал... Может кто-то делал когда-то или находил информацию какую-либо ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2020, 01:05
Ответы с готовыми решениями:

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

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; void lab...

Алгоритм надежной трассировки
Есть задача: найти путь с точки А в точку В, но искать его надо в процессе движения (тоесть...

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

7
465 / 336 / 134
Регистрация: 18.07.2017
Сообщений: 1,478
16.01.2020, 08:53 2
Цитата Сообщение от Skeety Посмотреть сообщение
Может я плохо искал
http://www.100byte.ru/100btwrks/wv/r.html
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 28
16.01.2020, 15:59  [ТС] 3
Цитата Сообщение от assemberist Посмотреть сообщение
http://www.100byte.ru/100btwrks/wv/r.html
Это же MaxScript , мне бы на c++ , либо на шарпе
0
465 / 336 / 134
Регистрация: 18.07.2017
Сообщений: 1,478
16.01.2020, 20:01 4
Стоило всего-то в гугле поискать. https://habr.com/ru/post/444828/
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
16.01.2020, 21:53 5
Цитата Сообщение от Skeety Посмотреть сообщение
Это же MaxScript , мне бы на c++ , либо на шарпе
Я вам перевёл с MaxScript на С++ "близко к тексту". "Литературную обработку" не делал.
Но, в качестве бонуса, добавил небольшую анимацию
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>       // for time() only
#include <Windows.h>   // for Sleep() only
 
using namespace std;
 
typedef unsigned char Byte;
typedef char Color;
 
struct Cell {
    Color WireColor;
};
 
typedef vector<Cell> CellVec;
 
// Возвращает true, если найдена свободная соседняя ячейка
bool fndCll(int kP2, const CellVec &arrB, Color clrE, Color clr, int, int nT) {
    if (kP2 >= 0 && kP2 < nT) {
        Color wc = arrB[kP2].WireColor;
        return wc == clrE || wc == clr;
    }
    return false;
}
 
void i2c(int nx, int index, int &x, int &y) {
    x = index % nx;
    y = index / nx;
}
 
const Color RED('R');
const Color BLUE('B');
const Color BLACK('T');
 
void print(int nx, int ny, const CellVec &arrB) {
    system("cls");
    for (int i = 0; i < ny; ++i) {
        for (int j = 0; j < nx; ++j) 
            cout << ' ' << arrB[i * nx + j].WireColor;
        cout << endl;
    }
    //system("pause");
    Sleep(300);
}
 
int main()
{
    srand((unsigned int)time(NULL));
 
    Color clr('.');
    Color clr2('#');
    CellVec arrB;
    int nx = 40;
    int ny = 20;
    int nT = nx * ny;
    // Формируем дискретное рабочее поле из nx * ny ячеек
    arrB.resize(nT);
    for (int i = 0; i < nT; ++i) arrB[i].WireColor = clr;
    print(nx, ny, arrB);
 
    int nC = (int)(0.2 * nT);
    // Формируем nC ячеек - препятствий
    for (int k = 0; k < nC; ++k) {
        int k2 = rand() % nT;
        arrB[k2].WireColor = clr2;
    }
    print(nx, ny, arrB);
 
    int xS, yS, xE, yE;
    xS = yS = xE = yE = 0;
 
    // Выбираем ячейку - источник
    int kS;
    // kS = 0;   // фиксированная точка начала пути
    kS = rand() % nT;
    i2c(nx, kS, xS, yS);
    arrB[kS].WireColor = BLUE;
    print(nx, ny, arrB);
 
    // Выбираем ячейку - приемник
    int kE;
    // kE = nT - 1;   // фиксированная точка конца пути
    kE = rand() % nT;
    i2c(nx, kE, xE, yE);
    arrB[kE].WireColor = BLACK;
    print(nx, ny, arrB);
 
    // Формирование пути
    int kC = kS;
    int nMx = 100;
    int i = 0;
    int x = xS;
    int y = yS;
    int d = abs(xE - x) + abs(yE - y);
    while (i < nMx && kC != kE) {
        vector<int> arrD{ d, d, d, d };
        i += 1;
        // Находим свободного, ближайшего к приемнику соседа текущей ячейки kC
        if ((kC + 1) % nx != 0 && fndCll((kC + 1), arrB, BLACK, clr, i, nT))
            arrD[0] = abs(xE - x - 1) + abs(yE - y);
        if (fndCll((kC + nx), arrB, BLACK, clr, i, nT))
            arrD[1] = abs(xE - x) + abs(yE - y - 1);
        if (kC % nx != 0 && fndCll((kC - 1), arrB, BLACK, clr, i, nT))
            arrD[2] = abs(xE - x + 1) + abs(yE - y);
        if (fndCll((kC - nx), arrB, BLACK, clr, i, nT))
            arrD[3] = abs(xE - x) + abs(yE - y + 1);
        int dM = *min_element(arrD.begin(), arrD.end());
 
        if (dM == d) {
            cout << "The path is not found" << endl;
            return 1;
        }
        int kM = distance(arrD.begin(), find(arrD.begin(), arrD.end(), dM));
        switch (kM) {
            case 0: x += 1; kC += 1; break;
            case 1 : y += 1; kC += nx; break;
            case 2 : x -= 1; kC -= 1; break;
            case 3 : y -= 1; kC -= nx; break;
        }
        Cell &bx = arrB[kC];
        bx.WireColor = RED;
        if (kC == kE)
            bx.WireColor = BLACK;
        print(nx, ny, arrB);
    }
    cout << "Target is reached. Trace length " << i << " steps." << endl;
}
Но вообще алгоритм крайне примитивный. Не думаю, что он имеет какой-то практический смысл.
1
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 28
18.01.2020, 22:25  [ТС] 6
L0M,
Цитата Сообщение от L0M Посмотреть сообщение
Но вообще алгоритм крайне примитивный. Не думаю, что он имеет какой-то практический смысл.
__________________
У вас я так понимаю рандомно все задается, а у меня уже все задано и так)
Смотрите, на втором фото как это выглядит. Прямоугольники с Буквами заглавными - это какие то условные компоненты схемы, на них заступать нельзя, а все вокруг них - свободное пространство. А на первом скрине показываются их соединения, как мы должны провести пути между ними. Все линии не получатся конечно, потому что пересекать линию, которая уже есть нельзя.
Миниатюры
Лучевой алгоритм трассировки   Лучевой алгоритм трассировки  
0
0 / 0 / 0
Регистрация: 06.01.2016
Сообщений: 28
18.01.2020, 23:13  [ТС] 7
Цитата Сообщение от L0M Посмотреть сообщение
Я вам перевёл с MaxScript на С++ "близко к тексту". "Литературную обработку" не делал.
Но, в качестве бонуса, добавил небольшую анимацию
А вообще, там немного не правильно описан лучевой алгоритм, лучи идут из источника и приемника по минимальному пути, одновременно. Потом они встречаются, и вот эта вся линия и будет путем, если они встретятся.
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
18.01.2020, 23:54 8
Цитата Сообщение от Skeety Посмотреть сообщение
У вас я так понимаю рандомно все задается, а у меня уже все задано и так)
Это не у меня. Это в первоисточнике.

А почему алгоритм примитивный... Во-первых, я немного понаблюдал за работой программы. Алгоритм не находит путь в достаточно простых ситуациях. Во-вторых, там же, в первоисточнике, написано
Лучевой алгоритм находит, в частности, применение в САПР печатных плат и интегральных схем для оценки качества размещения. При трассировке предпочтительнее употребление волнового алгоритма, более затратного, но всегда, в отличие от лучевого алгоритма, находящего существующий путь.
Ну и наконец, есть другие алгоритмы, опять-таки уже упоминавшийся по ссылке выше А*.

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

Добавлено через 3 минуты
Цитата Сообщение от Skeety Посмотреть сообщение
А вообще, там немного не правильно описан лучевой алгоритм,
Повторюсь: я в этом не спец и ничего не придумывал. Просто транспилировал программу.
0
18.01.2020, 23:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2020, 23:54
Помогаю со студенческими работами здесь

Алгоритм трассировки лучей
Нужна помощь в реализации алгоритма трассировки лучей в MathCAD

Лучевой поиск
Здравствуйте! Подскажите, как реализовать лучевой поиск заданного элемента в одномерном массиве?

Лучевой поиск
n := -1; for i:=0 to L-1 do begin if arr=x then begin n := i; break; ...

Лучевой монитор Samsung не работает
Монитор самсунг ...не включается.. не горит кнопка питания.. и слышатся тихие постоянные...


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

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

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