Russian Qt Forum
Апрель 30, 2024, 13:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [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);
}
Как раз то что мне надо, возвращает расстояние и пересекает ли луч целиндр. Как правильно заполнить входящие вектора параметрами целиндра, подскажите.
2  Программирование / Общий / Re: Оптимизация работы с памятью : Январь 13, 2022, 11:00
Спасибо
3  Программирование / Общий / Оптимизация работы с памятью : Январь 12, 2022, 09:47
Здравствуйте, уважаемые форумчане. Вопрос у меня простой, но хочется услышать мне со стороны.
В программе рассчитываются по математическим формулам массивы значений. Самих массивов данных многовато, но каждый из них не очень большой, например двумерный 30 на 30. Происходит это все в таймере 1 раз в 500 мс. Для расчета конечных массивов используются другие массивы тоже не большие со статическими данными (коэффициентами разными).  Есть у нас один человек на работе, которы любит все эти массивы завести в глобальной области, причем как статические заполненные данными так и массивы с результатами расчетов. Меня это напрягает. Но тут я подумала:данные массивы в памяти выделяются при старте программы и занимают ее до конца программы, что не хорошо. Но при выделении памяти внутри функции например используется ресурс на само выделение и удаление при выходе из функции и так каждые 500мс. Выделение памяти внутри самого класса тоже будет висеть все время работы программы так как у нее это все в основном классе QMainWindow. Вопрос в том, что целесообразнее жертвовать памятью занятой все время работы программы или производительностью. Извините, если вопрос для вас слишком банальный.
4  Qt / Общие вопросы / Re: Указатель типа void на структуру : Июнь 25, 2021, 16:20
Извините. Оказалось что все верно, это qDebug почему-то выводит только первый байт QByteArray. В так все методы работают.
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, тоже самое толь первый байт заполнен.
6  Qt / Общие вопросы / Re: Указатель типа void на структуру : Июнь 25, 2021, 09:15
В итоге надо по этому указателю записывать данные из QBytaArray в нужную структуру. И данные из структуры в QBytaArray другой переписывать.
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)
{
}


Страниц: [1]

Страница сгенерирована за 0.054 секунд. Запросов: 24.