在C ++中如何计算刀具路径长度?

时间:2019-05-20 16:16:17

标签: visual-c++

我正在处理刀具路径的生成,该路径由三维中的许多点组成,并且正在使用CNC机床生成它们。我要计算的一件事是刀具路径长度,它定义了路径的总长度。所以我尝试了这个:

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 :(得分:0)

像这样的事情-假设您想要的是点之间的距离而不是从起点开始(带有注释的第93行):

sigpos = sigpos(sigpos > 0)

抱歉,该错误-总和行存在两次-cout之后的行出现错误,还注意到了一些精确警告-混合使用double / float,所以在任何地方都切换为double,现在主循环如下所示:

#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;
}

答案 1 :(得分:0)

这里是完整的,简短的版本,包括简单的results.txt文件输出。 您可以删除两行带有注释信息输出的行:

#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;
}