Просмотр сообщений
|
Страниц: [1]
|
1
|
Qt / 2D и 3D графика / Пересечение луча и целиндра.
|
: Мая 26, 2023, 14:28
|
Добрый день всем. Встала необходимость работать с графикой 3д. Задача такая:необходимо найти пересечение луча( с началом в точке N (xn,yn,zn), углом относительно оси у) и целиндра. Ось целиндра параллелена плоскости x0y. я знаю геометрический центр целиндра C(xc,yc,zc), радиус R, длину L, и угол оси целиндра с осью у. Тесть целиндр горизонтальный как бы. Нашла на просторах интернета функцию пересечения луча и бесконечного целиндра boolean GLWidget::intcyl(QVector3D raybase, QVector3D raycos, QVector3D base, QVector3D axis, double radius, double *in, double *out) { boolean hit; /* True if ray intersects cyl */ QVector3D RC; /* Ray base to cylinder base */ double d; /* Shortest distance between */ /* the ray and the cylinder */ double t, s; /* Distances along the ray */ QVector3D n, D, O; double ln; const double pinf = HUGE; /* Positive infinity */ RC.setX(raybase.x() - base.x()); RC.setY(raybase.y() - base.y()); RC.setZ(raybase.z() - base.z()); n = QVector3D::crossProduct(raycos,axis); if ( (ln = n.length()) == 0 ) { /* ray parallel to cyl */ d = QVector3D::dotProduct(RC,axis); D.setX(RC.x() - d*axis.x()); D.setY(RC.y() - d*axis.y()); D.setZ(RC.z() - d*axis.z()); d = D.length(); *in = -pinf; *out = pinf; return (d <= radius); /* true if ray is in cyl*/ } n.normalize(); d = fabs (QVector3D::dotProduct(RC,n)); /* shortest distance */ hit = (d <= radius); if (hit) { /* if ray hits cylinder */ O = QVector3D::crossProduct(RC,axis); t = - QVector3D::dotProduct(O,n) / ln; O = QVector3D::crossProduct(n,axis); O.normalize(); s = fabs (sqrt(radius*radius - d*d) / QVector3D::dotProduct(raycos,O)); *in = t - s; /* entering distance */ *out = t + s; /* exiting distance */ } return (hit); }
Как раз то что мне надо, возвращает расстояние и пересекает ли луч целиндр. Как правильно заполнить входящие вектора параметрами целиндра, подскажите.
|
|
|
3
|
Программирование / Общий / Оптимизация работы с памятью
|
: Января 12, 2022, 09:47
|
Здравствуйте, уважаемые форумчане. Вопрос у меня простой, но хочется услышать мне со стороны. В программе рассчитываются по математическим формулам массивы значений. Самих массивов данных многовато, но каждый из них не очень большой, например двумерный 30 на 30. Происходит это все в таймере 1 раз в 500 мс. Для расчета конечных массивов используются другие массивы тоже не большие со статическими данными (коэффициентами разными). Есть у нас один человек на работе, которы любит все эти массивы завести в глобальной области, причем как статические заполненные данными так и массивы с результатами расчетов. Меня это напрягает. Но тут я подумала:данные массивы в памяти выделяются при старте программы и занимают ее до конца программы, что не хорошо. Но при выделении памяти внутри функции например используется ресурс на само выделение и удаление при выходе из функции и так каждые 500мс. Выделение памяти внутри самого класса тоже будет висеть все время работы программы так как у нее это все в основном классе QMainWindow. Вопрос в том, что целесообразнее жертвовать памятью занятой все время работы программы или производительностью. Извините, если вопрос для вас слишком банальный.
|
|
|
5
|
Qt / Общие вопросы / Re: Указатель типа void на структуру
|
: Июня 25, 2021, 16:06
|
Спасибо. Как ещё можно заменить получение данных побайтрво. Делаю так: char *dat=(char*)i.value()->get_extdata(); int count=0; while(count<i.value()->get_size()) { qDebug()<<*dat; ++dat; count++; }
Так выводит правильно все данные из найденной структуры.если заменяю например на QByteArray send; send.resize(i.value()->get_size());
memcpy(send.data(),(char*)i.value()->get_exdata(),i.value()->get_size()); qDebug()<<send;// размер верный send 8 байт, но данные толь первый байт есть, дальше пусто
Или например на fromRawData, тоже самое толь первый байт заполнен.
|
|
|
7
|
Qt / Общие вопросы / Указатель типа void на структуру
|
: Июня 25, 2021, 09:12
|
Здравствуйте. Создаю QHash с ключем в виде строки и класса. В класс передаются указатели на разные структуры данных. Потом произвожу поиск заданной структуры. Но как взять по указателю данные не понимаю. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QHash> #include <QString> #include <QDebug> #include "taggeddata.h"
struct str1 { int k; short y; char g;
}; struct str2 { int k; short y; char g;
}; struct str3 { int k; short y; char g;
};
namespace Ui { class MainWindow; }
class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();
QHash<QString, taggeddata*> hash; str1 ST1; str2 ST2; str3 ST3;
private: Ui::MainWindow *ui; void AddToList(char* ID, int size, void *exdata, int flags); void getHashData(char* ID); };
#endif // MAINWINDOW_H
Mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); AddToList("st1", sizeof(ST1), &ST1, IS_READABLE); AddToList("st2", sizeof(ST2), &ST2, IS_WRITABLE); AddToList("st3", sizeof(ST3), &ST3, IS_READABLE); AddToList("st4", sizeof(ST1), &ST1, IS_READABLE);
ST3.k=5; ST3.y=9; ST3.g=1; sleep(5); getHashData("st3"); }
MainWindow::~MainWindow() { delete ui; } void MainWindow::AddToList(char* ID, int size, void *exdata, int flags) { hash[ID]=new taggeddata(ID, size, exdata, flags);
} void MainWindow::getHashData(char* ID) {
QHashIterator<QString, taggeddata *> i(hash);
while (i.hasNext()) { i.next(); qDebug()<<"current data"<<i.value()->get_ID()<<i.value()->get_exdata()<<i.value()->get_flags();
if(strcmp(ID,i.value()->get_ID())==0) { qDebug()<<"FINED DATA+++++++++++++++++++++++"<<ID<<i.value()->get_exdata()<<i.value()->get_size(); break; }
} QByteArray ttt; ttt.clear();
memcpy(i.value()->get_exdata(), ttt, i.value()->get_size());
qDebug()<<ttt.size();// результат 0 !!!!!!
// формируем QByteArray // QByteArray sendArr; // sendArr.clear(); // qint16 count_st=2; // sendArr.append(count_st); // qDebug()<<sendArr.size(); // sendArr.append(ID,16); // qDebug()<<sendArr.size()<<sendArr; // sendArr.append(ID,);
}
taggeddata.h #ifndef TAGGEDDATA_H #define TAGGEDDATA_H
#include <QMutex>
#define IS_READABLE 1 #define IS_WRITABLE 2
class taggeddata {
public: taggeddata(char* ID, int size, void *exdata, int flags);
inline QMutex *get_mutex(){return &_mutex;}; inline void *get_exdata(){return _exdata;}; inline int get_size(){return _size;}; inline char* get_ID(){return _ID;}; inline int get_flags(){return _flags;};
private: QMutex _mutex; int _flags; void *_exdata; int _size; char* _ID;
}; #endif//TAGGEDDATA_H
taggeddata.cpp include "taggeddata.h"
taggeddata::taggeddata(char* ID, int size, void *exdata, int flags) : _flags(flags), _exdata(exdata), _size(size), _ID(ID) { }
|
|
|
|
|