в C ++, как рассчитать длину пути инструмента? - PullRequest
1 голос
/ 20 мая 2019

Я имею дело с генерацией траектории инструмента, в которой сложено много точек в трех измерениях, и я использую станок с ЧПУ для их генерации.Одна из вещей, которую я хочу вычислить, - это длина пути инструмента, которая определяет общую длину пути.Итак, я попробовал это:

1.6760 3.7901 6.1955 
1.2788 4.1872 5.3681
0.2832 5.1828 3.2939
0.1835 5.2173 3.0576
0.1097 5.1205 2.8292
0.0815 4.9185 2.6699
0.0812 4.8728 2.6491 
0.0810 4.8270 2.6288 
0.0807 4.7810 2.6089 

Точки похожи на эти.

// math.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include<math.h>

using std::cin;
using std::cout;
using std::endl;

using std::vector;

using std::ostream;
using std::istream;
using std::ifstream;

using std::operator>>;
using std::operator<<;

struct point

{
    float x ;
    float y ;
    float z ;
};

ostream& operator<< (ostream& out, const point &p)
{
    out << "(" << p.x << "," << p.y << " ," << p.z << "," << ")";
    return out;
}

istream& operator>> (istream& in, point& point)
{
    in >> point.x >> point.y >> point.z;
    return in;
}

struct line
{
    point start;
    point next;
    float sqDistance()
    {
        float dx = start.x - next.x;
        float dy = start.y - next.y;
        float dz = start.z - next.z;
        double distance = 0.0;
        distance = sqrt(dx * dx + dy * dy + dz * dz);
        return distance;
    }
};

ostream& operator<< (ostream& out, const line &ln)
{
    out << "From " << ln.start << " to " << ln.next;
    return out;
}

istream& operator>> (istream& in, line ln)
{
    cout << "Enter x y z start then x y z  next: ";
    in >> ln.start.x >> ln.start.y >> ln.start.z >>  ln.next.x >> ln.next.y >> ln.next.z;
    return in;
}

int main()
{
    point origin, input;
    line ray;
    vector<line> side;

    // READ POINTS FROM FILE
    ifstream pointfile("concave.txt");
    if (pointfile.is_open())
    {
        pointfile >> origin.x >> origin.y >> origin.z;
        cout << "origin: " << origin << endl;
        ray.start = origin;

        while (pointfile >> ray.next)
        {
            cout
                << " GOTO/ " << ray.next 
                << " The distance from point to the next is : "
                << ray.sqDistance() << endl;

            side.push_back(ray);
        }
    }
    else
        cout << "Unable to open file";
    pointfile.close();



    vector<line>::iterator iter = side.begin();
    line temp, closest = *iter;
    float minimumDistance = closest.sqDistance(), distance = 0.0;

    system("PAUSE");

    return 0;
}

-Я ожидаю расстояние между точкой и ее следующей точкой.
-Общая длина этоголиния.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Здесь полная, немного более короткая версия, включая простой вывод файла results.txt. Вы можете удалить 2 строки с выводом информации комментария:

#include <iostream>
#include <fstream>
#include <vector>
#include <conio.h>

using namespace std;

struct point
{
    float x;
    float y;
    float z;
};

ostream& operator<< (ostream& out, const point &p)
{
    out << "(" << p.x << "," << p.y << " ," << p.z << "," << ")";
    return out;
}

istream& operator>> (istream& in, point& point)
{
    in >> point.x >> point.y >> point.z;
    return in;
}

struct line
{
    point start;
    point next;
    double sqDistance()
    {
        float dx = start.x - next.x;
        float dy = start.y - next.y;
        float dz = start.z - next.z;
        double distance = 0.0;
        distance = sqrt(dx * dx + dy * dy + dz * dz);
        return distance;
    }
};

ostream& operator<< (ostream& out, const line &ln)
{
    out << "From " << ln.start << " to " << ln.next;
    return out;
}

istream& operator>> (istream& in, line ln)
{
    cout << "Enter x y z start then x y z  next: ";
    in >> ln.start.x >> ln.start.y >> ln.start.z >> ln.next.x >> ln.next.y >> ln.next.z;
    return in;
}

int main()
{
    point origin, input;
    line ray;
    vector<line> side;

    // READ POINTS FROM FILE
    ifstream pointfile("concave.txt");
    if (pointfile.is_open())
    {
        pointfile >> origin.x >> origin.y >> origin.z;
        cout << "origin: " << origin << endl;
        ray.start = origin;

        while (pointfile >> ray.next)
        {
            cout
                << " GOTO/ " << ray.next
                << " The distance from point to the next is : "
                << ray.sqDistance() << endl;

            side.push_back(ray);
            ray.start = ray.next; // set start to last end (?)
        }
    }
    else
        cout << "Unable to open file";
    pointfile.close();

    ofstream results("results.txt");
    vector<line>::iterator iter = side.begin();
    line closest = *iter;
    double distance, sumOfDistances = 0.0;
    cout << "Line coords" << endl << "distance | Sum of distances" << endl;
    while (iter != side.end()) {
        closest = *iter;
        distance = closest.sqDistance();
        sumOfDistances += distance;
        results << distance << endl;
        cout << closest << endl << distance << " | " << sumOfDistances << endl; // info output
        iter++;
    }
    results << sumOfDistances << " << Sum" << endl;
    results.close();
    cout << "Complete path distance: " << sumOfDistances << endl; // info output

    getch();

    return 0;
}
0 голосов
/ 20 мая 2019

Что-то вроде этого - предположим, что вы хотите расстояние между точками, а не от начала (строка 93 с комментарием):

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include<math.h>
#include <conio.h>

using std::cin;
using std::cout;
using std::endl;

using std::vector;

using std::ostream;
using std::istream;
using std::ifstream;

using std::operator>>;
using std::operator<<;

struct point

{
    float x ;
    float y ;
    float z ;
};

ostream& operator<< (ostream& out, const point &p)
{
    out << "(" << p.x << "," << p.y << " ," << p.z << "," << ")";
    return out;
}

istream& operator>> (istream& in, point& point)
{
    in >> point.x >> point.y >> point.z;
    return in;
}

struct line
{
    point start;
    point next;
    float sqDistance()
    {
        float dx = start.x - next.x;
        float dy = start.y - next.y;
        float dz = start.z - next.z;
        double distance = 0.0;
        distance = sqrt(dx * dx + dy * dy + dz * dz);
        return distance;
    }
};

ostream& operator<< (ostream& out, const line &ln)
{
    out << "From " << ln.start << " to " << ln.next;
    return out;
}

istream& operator>> (istream& in, line ln)
{
    cout << "Enter x y z start then x y z  next: ";
    in >> ln.start.x >> ln.start.y >> ln.start.z >>  ln.next.x >> ln.next.y >> ln.next.z;
    return in;
}

int main()
{
    point origin, input;
    line ray;
    vector<line> side;

    // READ POINTS FROM FILE
    ifstream pointfile("concave.txt");
    if (pointfile.is_open())
    {
        pointfile >> origin.x >> origin.y >> origin.z;
        cout << "origin: " << origin << endl;
        ray.start = origin;

        while (pointfile >> ray.next)
        {
            cout
                << " GOTO/ " << ray.next 
                << " The distance from point to the next is : "
                << ray.sqDistance() << endl;

            side.push_back(ray);
            ray.start = ray.next; // set start to last end (?)
        }
    }
    else
        cout << "Unable to open file";
    pointfile.close();

    vector<line>::iterator iter = side.begin();
    line temp, closest = *iter;
    float minimumDistance = closest.sqDistance(), distance, sumDistance = 0.0;
    cout << "Line coords" << endl << "distance, Sum of distances, minimum" << endl;
    while(iter != side.end()) {
        closest = *iter;
        distance = closest.sqDistance();
        sumDistance += distance;
        if(minimumDistance > distance) minimumDistance = distance;
        cout << closest << endl
              << distance << " | " << sumDistance << " | " << minimumDistance << endl;
        sumDistance += distance;
        iter++;
    }

    getch();

    return 0;
}

Извините за ошибку - строка суммы была там дважды - строка после cout была ошибкой, также заметили некоторое предупреждение о точности - смешанный double / float, поэтому везде переключается на double, теперь основной цикл выглядит так:

vector<line>::iterator iter = side.begin();
line closest = *iter;
double distance, sumOfDistances = 0.0;
cout << "Line coords" << endl << "distance | Sum of distances" << endl;
while (iter != side.end()) {
    closest = *iter;
    distance = closest.sqDistance();
    sumOfDistances += distance;
    cout << closest << endl << distance << " | " << sumOfDistances << endl; // step info output
    iter++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...