如何将输入文件中的坐标与 prim 算法一起使用,以便使用pygraphics和C++创建圆?

How to use coordinates from an input file with prim's algorithm in order to create circles using pygraphics and C++?

本文关键字:pygraphics 创建 C++ 一起 文件 输入 算法 prim 坐标      更新时间:2023-10-16

我在这里和谷歌上看了很多 Prim's 算法的例子,没有找到这个问题的真正答案......请原谅我对这个问题的结构。我对 S/O 打印内容的方式很糟糕。

我有一个输入文件" SmallGraph.txt ",其中包含一组坐标和顶部的顶点数:

9  
50 100  
100 150  
200 150  
300 150  
350 100  
300 50  
200 50  
100 50  
150 100

我在尝试弄清楚如何读取这些输入项时遇到了很多麻烦,以便我的 while 循环能够为上面提到的每个顶点打印一个"圆",这样我就可以运行 Prim 的算法以获得最小的生成树。

到目前为止,我有什么代码试图通过 while 循环打印出一些东西。另外,一些类来实现 Prim 的算法,我需要通过 python 绘制这些点:

#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstring>
#include <math.h>       /* pow() function */

// This line allows commonly-used functions to be used without specifying the 
// library in which that function is defined. For instance, this line allows
// the use of "cout" rather than the full specification "cout"
using namespace std;
class SetOfIntegers
{
    public:
        // Constructor. Any setup operation you wish for the class.
        SetOfIntegers()
        {
            members.clear();
        } // end constructor

        void add(int m)  // Add members to set WITHOUT repetition
        { 
            for (auto i : members)
            {
                if (i == m) return;  // no addition of existing member
            }
            members.push_back(m); 
        }
        int size() { return members.size(); }
        void show() { for (auto i: members) cout << i << "  "; cout << endl; }
        bool isMember(int m) 
        {
            //cout << "isMember(" << m << ") is ";
            for (auto i : members)
            {
                if (i == m) 
                {
                    //cout << " true" << endl;
                    return true;
                }
            }
            //cout << " false" << endl;
            return false;
        }
    private:
        vector<int> members;
};
//--------------------------------------------------------------------------
class Point
{
    public:
        // Constructor. Any setup operation you wish for the class.
        Point()
        {
            x = 0; y = 0;  
        } // end constructor
        Point(int a, int b, int id)
        {
            x = a; y = b; pointID = id;
        } // end constructor
        int getX() { return x; }
        int getY() { return y; }
        int getID() { return pointID; }
    private:
        int x = 0; 
        int y = 0;
        int pointID = 0;
}; // end class Point

//--------------------------------------------------------------------------
class Edge
{
    public:
        // Constructor. Any setup operation you wish for the class.
        Edge()
        {
        } // end constructor
        Edge(Point ptA, Point ptB)
        {
            pointA = ptA;
            pointB = ptB;
            length = sqrt(pow(abs(pointA.getX() - pointB.getX() ), 2) + pow(abs(pointA.getY() - pointB.getY() ), 2) );
        } // end constructor
        Point getPtA() { return pointA; }
        Point getPtB() { return pointB; }
        double getLen() { return length; }
        int getPtAID() { return pointA.getID(); }
        int getPtBID() { return pointB.getID(); }
    private:
        Point pointA;
        Point pointB;
        double length;
}; // end class Edge

// NOTE: DO NOT declare with empty parentheses, as vector<Point> myPointvector();
vector<Point> myPointvector;  // vector will expand as needed
vector<Edge> MinSpanTree;

// Pass arguments or parameters from command-line execution. argc is the count of
// those parameters, including the executable filename. argv[] is an array of the 
// parameters.
int main (int argc, char *argv[])
{
    string token;
    int xValue, yValue;
    ifstream fin;
    int coordPairs;  // number of coordinate pairs in the file
    int ptX, ptY;
    vector<Edge> unsortedEdgeVector;
    vector<Edge> sortedEdgeVector;
    int loopCounter;
    int pointCounter = 0;
    double MSTLength = 0.0;

    // Check the number of arguments. Expected: filename of a file
    if (argc != 2)  // This check is often hardcoded
    {   // If failure in parameters, offer advice for correction
        cout << "nThis program uses command-line argument.n";
        cout << "Usage: a.exe <filename>n";
        exit(0);
    }

    try  // All lines within this block are part of the same exception handler
    {
        fin.open(argv[1]);
    } 
    catch (exception& ex) 
    {
        cout << ex.what();  // display standard explanation of the exception
        exit(0);  // exit the program
    }

    // Read from the file, one token at a time. If the type of token is known, it
    // can be read into a corresponding variable type, such as 
    //          in >> x;    // Read the first item into an integer variable x.
    //          in >> str;  // Read the next item into a string variable str.
    //for (int i = 0; 1 != 10; i++) {
    //  fin >> ptX[2] >> ptY[2];
    //}
    //cout << ptX << endl;
    // This line provides the graphic window setup. 
    cout << "800 600 white" << endl;
    fin >> coordPairs;
    while (fin >> ptX)
    {
        // Do something with the element read from the file
        cout << ptX << endl;
        fin >> ptY;   
        cout << ptY << endl;
        cout << "circle " << ptX << " " << ptY << " " << 20 << " seagreen" << endl;
        /*
        Point dummyPoint(ptX, ptY, pointCounter++);
        myPointvector.push_back(dummyPoint);  // vector will expand as needed
        cout << "Now myPointvector has size " << myPointvector.size() << endl;
        */
    } // end while
    fin.close();
}

如您所见...我的主函数中有一个 while 循环,它试图基于 ptX 和 ptY 创建一个"圆"。这就是我遇到的麻烦。我如何从这个输入文件中读取以获得这些点并让它们通过 python 创建一个圆?如果你注意到..我尝试了一个当前被注释掉以读取文件的 for 循环。

我使用了错误的命令从输入文件请求信息。我正在使用以下命令:

g++ -std=c++11 PrimMSTAlgor.cpp (Compile the code)
a PrimMSTAlgor.cpp > PrimData.dat (Put data into primData.dat from the .cpp file)
python BearPlot.py PrimData.dat (use python to apply graphics)

第二个命令不正确。我需要使用 .txt 文件作为"a"(执行(的参数。

a SmallGraph.txt > PrimData.dat

我已经设置为以这种方式将输入放入.dat文件中,我只是看不到它......