В С++, как рассчитать длину пути инструмента?

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
318
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как насчет чего-то вроде этого - предположим, вам нужно расстояние между точками, а не от начала (строка 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++;
}

Вы можете принять ответ, поставив галочку под кнопками голосования, если вы также помните, как обращаться со всеми контейнерами. Используемый вами вектор хорошо описан здесь, например, cplusplus.com/reference/vector/vector/begin

Tom 20.05.2019 20:06

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

Angelique Uwimbabazi 21.05.2019 09:44

sumDistance — не тот? расстояние - это сумма каждого сегмента, а сумма должна суммировать все сегменты. И спасибо за принятие ;-)

Tom 21.05.2019 09:49

да, расстояние не правильное, потому что я пытаюсь сделать суммирование последнего, затем я нашел другое число, которое у меня есть. в любом случае спасибо за вашу помощь!

Angelique Uwimbabazi 21.05.2019 10:13

Не уверен, что все в порядке, на всякий случай дайте мне знать - поскольку я не являюсь носителем английского языка, иногда немного сложнее понять некоторые предложения ;-)

Tom 21.05.2019 10:27

Да! вы правы! расстояние - это сумма каждого сегмента, а сумма должна суммировать все сегменты. Я думаю, что проблема в этом минимуме, потому что сумма неверна.

Angelique Uwimbabazi 22.05.2019 05:26

Странно, может поможет какая-то математика или пример - как я проверял, функция расстояния теперь вызывается для каждой пары, ее результаты суммируются. Не уверен, где может быть проблема. Или не могли бы вы объяснить или показать, что по-прежнему не так по вашим проверкам? (возможно, вы можете отредактировать вопрос и добавить туда какое-то объяснение или какие результаты вы ожидаете от своего или другого примера)

Tom 22.05.2019 07:24

Проблема была в минимальном расстоянии. Я хочу только расстояние и сумму расстояния

Angelique Uwimbabazi 23.05.2019 06:40

Вот полная, немного более короткая версия, включая простой вывод файла 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;
}

Том большое спасибо за хороший ответ! теперь на мой вопрос дан ответ.

Angelique Uwimbabazi 23.05.2019 09:15

И еще раз извините за баг - сгенерированный, вероятно, при копировании сюда(?). Кстати, если вы не хотите терять репутацию, попробуйте немного больше изучить программирование, но спасибо за простой вопрос/ответ/принятие и 15 баллов ;-) Я, например, потерял несколько баллов за каждый вопрос здесь.

Tom 23.05.2019 09:20

Другие вопросы по теме