// transformiert Koordinaten anhand von zwei Punkten - gibt List mit transformierten Punkten zurück
        public static List<Punkt> transformCoordinates2P(Punkt oP1, Punkt oP2, Punkt rP1, Punkt rP2, List<Punkt> oPoints)
        {
            // Vektor v (Elemente a, b, c und d)
            double[] v = calcVecABCD(oP1, oP2, rP1, rP2);
        
            // Transformationsgleichungen
            List<Punkt> rPoints = new List<Punkt>();
            for (int i = 0; i < oPoints.Count; i++)
            {
                double x = calculateXValue(v, oPoints[i]);
                double y = calculateYValue(v, oPoints[i]);
                rPoints.Add(new Punkt(x, y));
            }

            return rPoints;
        }
 private static double calculateYValue(double[] v, Punkt point)
 {
     return v[1] * point.getX() - v[0] * point.getY() + v[3];
 }
 // Berechnet die Distanz zwischen zwei Punkten
 public static double calculateEukDistance(Punkt p1, Punkt p2)
 {
     return Math.Sqrt(Math.Pow(p1.getX() - p2.getX(), 2) + Math.Pow(p1.getY() - p2.getY(), 2));
 }
        // Matrix 
        public static double[] calcVecABCD(Punkt oP1, Punkt oP2, Punkt rP1, Punkt rP2)
        {
            // Matrixattribute
            double x1 = oP1.getX(), y1 = oP1.getY(), x2 = oP2.getX(), y2 = oP2.getY();
            double rx1 = rP1.getX(), ry1 = rP1.getY(), rx2 = rP2.getX(), ry2 = rP2.getY();

            // Vektor u
            double[] u = new double[] { rx1, ry1, rx2, ry2 };

            double[] m1 = new double[] { x1, y1, 1, 0 };
            double[] m2 = new double[] {-1 * y1, x1, 0, 1};
            double[] m3 = new double[] { x2, y2, 1, 0 };
            double[] m4 = new double[] {-1* y2, x2, 0, 1};

            List<double[]> tmp = new List<double[]>();
            tmp.Add(m1);
            tmp.Add(m2);
            tmp.Add(m3);
            tmp.Add(m4);

            // Matrix M
            double[][] M = new double[4][];
            for (int i = 0; i < tmp.Count; i++){
                M[i] = new double[4];
                for (int j = 0; j < tmp[i].Length; j++){
                    M[i][j] = tmp[i][j];
                }
            }

            // inverse Matrix M
            double[][] M1 = inverse2DMatrix(M);

            // invM multipliziert mit u
            double[] v = multiplyMatrix1D(M1, u);

            // Zielvektor v
            return v;
        }
        // berechnet den Flächeninhalt eines Polygons
        static public double calcAreaPolygon(List<Punkt> inputPoints)
        {
            List<Punkt> points = new List<Punkt>();
            // transferieren der Punktdaten
            for (int i = 0; i < inputPoints.Count; i++)
            {
                points.Add(inputPoints[i]);
            }

            // Liste mit sortierten Punkten
            List<Punkt> calcPoints = new List<Punkt>();
            Punkt tmpPoint = null;

            // Punkt 1
            double a = 100000.00;
            for (int i = 0; i < points.Count; i++)
            {
                // suche nach der geringsten Distanz zum Ursprung
                double t = Math.Sqrt(Math.Pow(points[i].getX(), 2) + Math.Pow(points[i].getY(), 2));
                if (t < a) {
                    a = t;
                    tmpPoint = points[i];
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;
            
            // Punkt 2
            Punkt y_min = new Punkt(100000.0, 10000.0);
            tmpPoint = new Punkt(100000.0, 100000.0);

            for (int i = 0; i < points.Count; i++)
            {
                if (y_min.getY() > points[i].getY())
                {
                    y_min = points[i];
                }
            }

            for (int i = 0; i < points.Count; i++)
            {
                if (points[i] != y_min)
                {
                    if (tmpPoint.getX() > points[i].getX())
                    {
                        tmpPoint = points[i];
                    }
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;
            y_min = null;

            // Punkt 3
            y_min = new Punkt(100000.0, 10000.0);
            tmpPoint = new Punkt(0.0, 0.0);

            for (int i = 0; i < points.Count; i++)
            {
                if (y_min.getY() > points[i].getY())
                {
                    y_min = points[i];
                }
            }

            for (int i = 0; i < points.Count; i++)
            {
                if (points[i] != y_min)
                {
                    if (tmpPoint.getX() < points[i].getX())
                    {
                        tmpPoint = points[i];
                    }
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;

            // Punkt 4
            calcPoints.Add(points[0]);

            // Berechnung der Fläche anhand eines Polygonzuges
            double area = (calcPoints[0].getY() + calcPoints[1].getY()) * (calcPoints[0].getX() - calcPoints[1].getX()) +
                (calcPoints[1].getY() + calcPoints[2].getY()) * (calcPoints[1].getX() - calcPoints[2].getX()) +
                (calcPoints[2].getY() + calcPoints[3].getY()) * (calcPoints[2].getX() - calcPoints[3].getX()) +
                (calcPoints[3].getY() + calcPoints[0].getY()) * (calcPoints[3].getX() - calcPoints[0].getX());

            if (area < 0)
            {
                area = area * -1;
            }

            return area / 2;
        }
        // berechnet den Mittelpunkt eines Viereckes
        static public Punkt calcCenterCube(List<Punkt> inputPoints)
        {
            List<Punkt> points = new List<Punkt>();
            // transferieren der Punktdaten
            for (int i = 0; i < inputPoints.Count; i++)
            {
                points.Add(inputPoints[i]);    
            }

            // Liste mit sortierten Punkten
            List<Punkt> calcPoints = new List<Punkt>();
            Punkt tmpPoint = null;

            // Punkt 1
            double a = 100000.00;
            for (int i = 0; i < points.Count; i++)
            {
                // suche nach der geringsten Distanz zum Ursprung
                double t = Math.Sqrt(Math.Pow(points[i].getX(), 2) + Math.Pow(points[i].getY(), 2));
                if (t < a)
                {
                    a = t;
                    tmpPoint = points[i];
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;

            // Punkt 2
            Punkt y_min = new Punkt(100000.0, 10000.0);
            tmpPoint = new Punkt(100000.0, 100000.0);

            for (int i = 0; i < points.Count; i++)
            {
                if (y_min.getY() > points[i].getY())
                {
                    y_min = points[i];
                }
            }

            for (int i = 0; i < points.Count; i++)
            {
                if (points[i] != y_min)
                {
                    if (tmpPoint.getX() > points[i].getX())
                    {
                        tmpPoint = points[i];
                    }
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;
            y_min = null;

            // Punkt 3
            y_min = new Punkt(100000.0, 10000.0);
            tmpPoint = new Punkt(0.0, 0.0);

            for (int i = 0; i < points.Count; i++)
            {
                if (y_min.getY() > points[i].getY())
                {
                    y_min = points[i];
                }
            }

            for (int i = 0; i < points.Count; i++)
            {
                if (points[i] != y_min)
                {
                    if (tmpPoint.getX() < points[i].getX())
                    {
                        tmpPoint = points[i];
                    }
                }
            }

            calcPoints.Add(tmpPoint);
            points.Remove(tmpPoint);

            tmpPoint = null;

            // Punkt 4
            calcPoints.Add(points[0]);

            // Gerade 1
            double m1 = 0.0;
            if ((calcPoints[0].getY() == calcPoints[2].getY()) || (calcPoints[0].getX() == calcPoints[2].getX())){
                m1 = 0.0;
            }
            else
            {
                m1 = (calcPoints[0].getY() - calcPoints[2].getY()) / (calcPoints[0].getX() - calcPoints[2].getX());
            }
            double b1 = calcPoints[0].getY() - calcPoints[0].getX() * m1;

            // Gerade 2
            double m2 = 0.0;
            if ((calcPoints[1].getY() == calcPoints[3].getY()) || (calcPoints[1].getX() == calcPoints[3].getX()))
            {
                m2 = 0.0;
            }
            else
            {
                m2 = (calcPoints[1].getY() - calcPoints[3].getY()) / (calcPoints[1].getX() - calcPoints[3].getX());
            }
            double b2 = calcPoints[1].getY() - calcPoints[1].getX() * m2;

            // Berechnung des Schnittpunktes
            double xs = m1 - m2;
            double bs = b2 - b1;
            double x = bs / xs;
            double y = x * m1 + b1;
            return new Punkt(x, y);
        }
Пример #7
0
        // importieren der Initialisierungsdefinitionen
        private void readIniFile()
        {
            double ref1X = 0 , ref1Y = 0 , ref2X = 0, ref2Y = 0;
            try
            {
                string line;
                using (StreamReader sr = new StreamReader(inifile))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        if ((line[0] != '#') && (line[0] != ' '))
                        {
                            string[] split = line.Split('=');
                            if (split[0] == "OBJEKTERKENNUNGAPP")
                            {
                                detectorApp = split[1];
                            }
                            else if (split[0] == "PYTHONAPP")
                            {
                                pythonApp = split[1];
                            }
                            else if (split[0] == "INPUT_CORNERS")
                            {
                                input_corners = split[1];
                            }
                            else if (split[0] == "OUTPUT_CORNERS")
                            {
                                output_corners = split[1];
                            }
                            else if (split[0] == "PICTUREOUTPUT")
                            {
                                pictureoutput = split[1];
                            }
                            else if (split[0] == "PYTHON")
                            {
                                python = split[1];
                            }
                            else if (split[0] == "PORT")
                            {
                                port = Convert.ToInt16(split[1]);
                            }
                            else if (split[0] == "IPADRESS")
                            {
                                ipadress = split[1];
                            }
                            else if (split[0] == "Max_Area_Center")
                            {
                                maxAreaCentering = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "Min_Area_Center")
                            {
                                minAreaCentering = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "Max_Area_Convert")
                            {
                                maxAreaConverting = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "Min_Area_Convert")
                            {
                                minAreaConverting = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "Range_Center")
                            {
                                rangeCentering = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "Range_Convert")
                            {
                                rangeConverting = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "GROUPSIZE")
                            {
                                groupSize = Convert.ToInt16(split[1]);
                            }
                            else if (split[0] == "HEIGHT")
                            {
                                height = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "RADIUS")
                            {
                                radius = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "REFERENZ_1_X")
                            {
                                ref1X = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "REFERENZ_1_Y")
                            {
                                ref1Y = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "REFERENZ_2_X")
                            {
                                ref2X = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "REFERENZ_2_Y")
                            {
                                ref2Y = Convert.ToDouble(split[1]);
                            }
                            else if (split[0] == "TRANS_CENTERS")
                            {
                                transOutput = split[1];
                            }
                        }
                    }
                }
                referencePoint1 = new Punkt(ref1X, ref1Y);
                referencePoint2 = new Punkt(ref2X, ref2Y);
            }
            catch (Exception e)
            {

            }
        }
Пример #8
0
        private void btConvert_Click(object sender, EventArgs e)
        {
            if (convertPoints.Count == 2)
            {
                // Punkt 1
                Punkt p1 = convertPoints[0];
                // Punkt 2
                Punkt p2 = convertPoints[1];

                // euklidische Länge - Big Cubes Detektorkoordinaten
                double d1 = Funktionen.calculateEukDistance(p1, p2);
                // euklidische Länge - Referenzkoordinaten
                double d2 = Funktionen.calculateEukDistance(referencePoint1, referencePoint2);

                // Verhältnis zur Umrechnung der Koordinaten
                double relation = d1 / d2;

                // Mittelpunkte laden
                List<Punkt> dataCenters = new List<Punkt>();
                String line;
                using (StreamReader sr = new StreamReader(output_corners))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        line = line.Replace('.', ',');
                        String[] split = line.Split(';');
                        Punkt point = new Punkt(Convert.ToDouble(split[0]),
                            Convert.ToDouble(split[1])); 
                        dataCenters.Add(point);
                    }

                }

                // Umrechnung auf Millimeter
                List<Punkt> centerMilli = new List<Punkt>();
                for (int i = 0; i < dataCenters.Count; i++)
                {
                    Punkt point = new Punkt(dataCenters[i].getX() / relation,
                        dataCenters[i].getY() / relation);
                    centerMilli.Add(point);
                }
                dataCenters.Clear();
                dataCenters = null;

                Punkt p1Milli = new Punkt(p1.getX() / relation,
                    p1.getY() / relation);
                Punkt p2Milli = new Punkt(p2.getX() / relation,
                    p2.getY() / relation);

                // An Roboterkoordinaten anpassen
                List<Punkt> rPoints = Funktionen.transformCoordinates2P(p1Milli,
                    p2Milli, referencePoint1, referencePoint2, centerMilli);

                // speichern der transformierten Punkten
                using (StreamWriter sw = new StreamWriter(transOutput))
                {
                    for (int i = 0; i < rPoints.Count; i++)
                    {
                        line = Convert.ToString(rPoints[i].getX()) + ";"
                            + Convert.ToString(rPoints[i].getY());
                        sw.WriteLine(line);
                        line = "";
                    }
                    sw.Close();
                }

                // ins Klassenattribute verschieben
                this.synPoints = rPoints;

                Series series1 = new Series();
                series1.Name = "Transformierte Mittelpunkte";
                series1.ChartType = SeriesChartType.Point;

                Series series2 = new Series();
                series2.Name = "Referenzpunkte";
                series2.ChartType = SeriesChartType.Point;

                for (int i = 0; i < rPoints.Count; i++)
                {
                    series1.Points.AddXY(rPoints[i].getX(), rPoints[i].getY());
                }

                series2.Points.AddXY(referencePoint1.getX(), referencePoint1.getY());
                series2.Points.AddXY(referencePoint2.getX(), referencePoint2.getY());

                scatterPlotTrans.Series.Clear();
                scatterPlotTrans.Series.Add(series1);
                scatterPlotTrans.Series.Add(series2);

                MessageBox.Show("Punkte wurden transformiert.");

                // Synchronisation (Datenaustausch) freischalten
                btSync.Enabled = true;
            }
            else
            {
                MessageBox.Show("Zu wenig oder zu viele Referenzpunkte: Bitte führen Sie die Mittelpunkts" +
                    "berechnung erneut mit anderen Größe aus");
            }            
        }
Пример #9
0
        // Mittelpunktberechnung aufrufen
        private void btCenter_Click(object sender, EventArgs e)
        {
            // Parallelisiertes Rechnen 
            Parallelisierung parallelisierung = new Parallelisierung(maxAreaCentering,
                minAreaCentering, rangeCentering, maxAreaConverting, minAreaConverting,
                rangeConverting, radius, groupSize);

            List<Punkt> corners = new List<Punkt>();
            string line;
            try
            { 
                using (StreamReader sr = new StreamReader(input_corners))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        line = line.Replace('.', ',');
                        String[] split = line.Split(';');
                        Punkt point = new Punkt(Convert.ToDouble(split[0]), Convert.ToDouble(split[1]));
                        corners.Add(point);
                    }
                }
            } catch (Exception ex){}

            // Gruppen bilden
            parallelisierung.setCorners(corners);
            parallelisierung.createGroups();

            // Berechnung der Mittelpunkte
            parallelisierung.calculateCenters(3);

            // speichern der Mittelpunkte
            parallelisierung.exportCenters(output_corners);

            // lese Ergebnis ein
            List<double[]> dataCenters = new List<double[]>();
            using (StreamReader sr = new StreamReader(output_corners))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    line = line.Replace('.', ',');
                    String[] split = line.Split(';');
                    double[] tmp = new double[2];
                    tmp[0] = Convert.ToDouble(split[0]);
                    tmp[1] = Convert.ToDouble(split[1]);
                    dataCenters.Add(tmp);
                }

            }

            // lese Referenz ein (Eckdaten)
            List<double[]> dataCorners = new List<double[]>();
            using (StreamReader sr = new StreamReader(input_corners))
            {

                while ((line = sr.ReadLine()) != null)
                {
                    line = line.Replace('.', ',');
                    String[] split = line.Split(';');
                    double[] tmp = new double[2];
                    tmp[0] = Convert.ToDouble(split[0]);
                    tmp[1] = Convert.ToDouble(split[1]);
                    dataCorners.Add(tmp);
                }

            }

            // Erstellen des Scatter Plots
            // Ecken
            Series series1 = new Series();
            series1.Name = "Corner Points";
            series1.ChartType = SeriesChartType.Point;
            // Mittelpunkte
            Series series2 = new Series();
            series2.Name = "Center Points";
            series2.ChartType = SeriesChartType.Point;
            // Mittelpunkte - Konvertierung
            Series series3 = new Series();
            series3.Name = "Center Big Cubes";
            series3.ChartType = SeriesChartType.Point;

            scatterPlot.Series.Clear(); // leert alle alten Reihen

            // Series 1 & 2
            for (int i = 0; i < dataCorners.Count(); i++)
            {
                series1.Points.AddXY(dataCorners[i][0], dataCorners[i][1]);
            }

            for (int i = 0; i < dataCenters.Count(); i++)
            {
                series2.Points.AddXY(dataCenters[i][0], dataCenters[i][1]);
            }

            scatterPlot.Series.Add(series1);
            scatterPlot.Series.Add(series2);

            // Series 3
            List<Punkt> data = parallelisierung.getCentersConvert();
            for (int i = 0; i < data.Count; i++)
            {
                series3.Points.AddXY(data[i].getX(), data[i].getY());
                convertPoints.Add(data[i]);
            }
            scatterPlot.Series.Add(series3);

            // schaltet das Synchronisieren frei
            btConvert.Enabled = true;

            progressBar.MarqueeAnimationSpeed = 0;
            progressBar.Visible = false;
        }