public static bool CorrespondenceOfCirclesInCylinderRot(double teta, double[] axisDirection, double[] translationalVector,
                                                                List <MyCircle> listOfCircleFirst, List <MyCircle> listOfCircleSecond)
        {
            const string nameFile = "GetRotationalPatterns.txt";

            var numOfCircleFirst  = listOfCircleFirst.Count;
            var numOfCircleSecond = listOfCircleSecond.Count;

            // OBSERVATION: int i, j are such that 0<=i,j<=2
            if (numOfCircleFirst > 0)
            {
                int i = 0;
                // for every circle of first cylinder
                while (i < numOfCircleFirst)
                {
                    var firstCenter           = listOfCircleFirst[i].centerCircle;
                    var firstCenterTranslated = new MyVertex(firstCenter.x + translationalVector[0],
                                                             firstCenter.y + translationalVector[1], firstCenter.z + translationalVector[2]);

                    int j = 0;
                    var thisCircleIsOk = false;

                    while (thisCircleIsOk == false && j < numOfCircleSecond)
                    {
                        var secondCenter           = listOfCircleSecond[j].centerCircle;
                        var secondCenterTranslated = new MyVertex(secondCenter.x + translationalVector[0],
                                                                  secondCenter.y + translationalVector[1], secondCenter.z + translationalVector[2]);

                        thisCircleIsOk = secondCenterTranslated.IsRotationOf(firstCenterTranslated, teta, axisDirection);

                        if (thisCircleIsOk)
                        {
                            listOfCircleSecond.RemoveAt(j);
                        }
                        j++;
                    }
                    if (!thisCircleIsOk)
                    {
                        return(false);
                    }
                    numOfCircleSecond = listOfCircleSecond.Count;
                    i++;
                }
            }

            return(true);
        }
        public static bool IsRotationTwoComp_Assembly(MyRepeatedComponent firstComponent,
                                                      MyRepeatedComponent secondComponent, double teta, double[] axisDirection)
        {
            const string nameFile = "GetRotationalPatterns.txt";
            int          i        = 0;

            while (i < 3)
            {
                var firstVector = new MyVertex(
                    //firstComponent.Transform.RotationMatrix[i, 0],
                    //firstComponent.Transform.RotationMatrix[i, 1],
                    //firstComponent.Transform.RotationMatrix[i, 2]
                    firstComponent.Transform.RotationMatrix[0, i],
                    firstComponent.Transform.RotationMatrix[1, i],
                    firstComponent.Transform.RotationMatrix[2, i]
                    );
                var secondVector = new MyVertex(
                    //secondComponent.Transform.RotationMatrix[i, 0],
                    //secondComponent.Transform.RotationMatrix[i, 1],
                    //secondComponent.Transform.RotationMatrix[i, 2]
                    secondComponent.Transform.RotationMatrix[0, i],
                    secondComponent.Transform.RotationMatrix[1, i],
                    secondComponent.Transform.RotationMatrix[2, i]
                    );



                if (secondVector.IsRotationOf(firstVector, teta, axisDirection))
                {
                    i++;
                }
                else
                {
                    return(false);
                }
            }


            return(true);
        }
        public static bool CorrespondenceOfEllipsesInCylinderRot(double teta, double[] axisDirection, double[] translationalVector,
                                                                 List <MyEllipse> listOfEllipseFirst, List <MyEllipse> listOfEllipseSecond)
        {
            const string nameFile = "GetRotationalPatterns.txt";

            var numOfEllipseFirst  = listOfEllipseFirst.Count;
            var numOfEllipseSecond = listOfEllipseSecond.Count;
            var tolerance          = Math.Pow(10, -5);

            // OBSERVATION: int i, j are such that 0<=i,j<=2
            if (numOfEllipseFirst > 0)
            {
                int i = 0;
                // for every ellipse of first cylinder
                while (i < numOfEllipseFirst)
                {
                    var firstEllipse          = listOfEllipseFirst[i];
                    var firstCenter           = firstEllipse.centerEllipse;
                    var firstCenterTranslated = new MyVertex(firstCenter.x + translationalVector[0],
                                                             firstCenter.y + translationalVector[1], firstCenter.z + translationalVector[2]);

                    //var whatToWrite = string.Format("Centro della prima ellisse ({0},{1},{2})", firstEllipse.centerEllipse.x, firstEllipse.centerEllipse.y, firstEllipse.centerEllipse.z);
                    //KLdebug.Print(whatToWrite, nameFile);

                    int j = 0;
                    var thisEllipseIsOk = false;

                    while (thisEllipseIsOk == false && j < numOfEllipseSecond)
                    {
                        var secondEllipse = listOfEllipseSecond[j];
                        //whatToWrite = string.Format("Centro della seconda ellisse ({0},{1},{2})", secondEllipse.centerEllipse.x, secondEllipse.centerEllipse.y, secondEllipse.centerEllipse.z);
                        //KLdebug.Print(whatToWrite, nameFile);

                        //comparison of the ellipse centers:
                        var secondCenter           = secondEllipse.centerEllipse;
                        var secondCenterTranslated = new MyVertex(secondCenter.x + translationalVector[0],
                                                                  secondCenter.y + translationalVector[1], secondCenter.z + translationalVector[2]);
                        thisEllipseIsOk = secondCenterTranslated.IsRotationOf(firstCenterTranslated,
                                                                              teta, axisDirection);
                        if (thisEllipseIsOk)
                        {
                            //if the radius correspond:
                            if (Math.Abs(firstEllipse.majorRadEllipse - secondEllipse.majorRadEllipse) < tolerance &&
                                Math.Abs(firstEllipse.minorRadEllipse - secondEllipse.minorRadEllipse) < tolerance)
                            {
                                //check if the directions corresponding to the axis are ok:

                                var firstMajorAxisDirectionEllipseMyVertex = new MyVertex(firstEllipse.majorAxisDirectionEllipse[0],
                                                                                          firstEllipse.majorAxisDirectionEllipse[1], firstEllipse.majorAxisDirectionEllipse[2]);

                                var firstMinorAxisDirectionEllipseMyVertex = new MyVertex(firstEllipse.minorAxisDirectionEllipse[0],
                                                                                          firstEllipse.minorAxisDirectionEllipse[1], firstEllipse.minorAxisDirectionEllipse[2]);

                                var firstMajorAxisDirectionEllipseOppositeMyVertex = new MyVertex(-firstEllipse.majorAxisDirectionEllipse[0],
                                                                                                  -firstEllipse.majorAxisDirectionEllipse[1], -firstEllipse.majorAxisDirectionEllipse[2]);

                                var firstMinorAxisDirectionEllipseOppositeMyVertex = new MyVertex(-firstEllipse.minorAxisDirectionEllipse[0],
                                                                                                  -firstEllipse.minorAxisDirectionEllipse[1], -firstEllipse.minorAxisDirectionEllipse[2]);

                                var secondMajorAxisDirectionEllipseMyVertex = new MyVertex(secondEllipse.majorAxisDirectionEllipse[0],
                                                                                           secondEllipse.majorAxisDirectionEllipse[1], secondEllipse.majorAxisDirectionEllipse[2]);

                                var secondMinorAxisDirectionEllipseMyVertex = new MyVertex(secondEllipse.minorAxisDirectionEllipse[0],
                                                                                           secondEllipse.minorAxisDirectionEllipse[1], secondEllipse.minorAxisDirectionEllipse[2]);

                                if (
                                    secondMajorAxisDirectionEllipseMyVertex.IsRotationOf(
                                        firstMajorAxisDirectionEllipseMyVertex, teta, axisDirection) ||
                                    secondMajorAxisDirectionEllipseMyVertex.IsRotationOf(
                                        firstMajorAxisDirectionEllipseOppositeMyVertex, teta, axisDirection))
                                {
                                    if (
                                        secondMinorAxisDirectionEllipseMyVertex.IsRotationOf(
                                            firstMinorAxisDirectionEllipseMyVertex, teta, axisDirection) ||
                                        secondMinorAxisDirectionEllipseMyVertex.IsRotationOf(
                                            firstMinorAxisDirectionEllipseOppositeMyVertex, teta, axisDirection))
                                    {
                                        listOfEllipseSecond.RemoveAt(j);
                                    }
                                    else
                                    {
                                        thisEllipseIsOk = false;
                                    }
                                }
                                else
                                {
                                    thisEllipseIsOk = false;
                                }
                            }
                            else
                            {
                                thisEllipseIsOk = false;
                            }
                        }
                        j++;
                    }
                    if (!thisEllipseIsOk)
                    {
                        return(false);
                    }
                    else
                    {
                        numOfEllipseSecond = listOfEllipseSecond.Count;
                        i++;
                    }
                }
            }
            return(true);
        }