Exemple #1
0
        public ProdGrid(long size, iProgressIndicator ProgressReceptor)
        {
            long RIndex = 0;
            long IIndex = 0;

            minFactNum      = long.MaxValue;
            GridSize        = size;
            LowerLeftCorner = new ComplNum(-size, -size);
            long ArrSize = (2 * size + 1);

            FactorSets = new ComplFactors[ArrSize, ArrSize];
            double ItemsToAnalyze = ArrSize * ArrSize;

            for (RIndex = 0; RIndex < ArrSize; RIndex++)
            {
                for (IIndex = 0; IIndex < ArrSize; IIndex++)
                {
                    FactorSets[RIndex, IIndex] = new ComplFactors(new ComplNum(LowerLeftCorner.Re + RIndex, LowerLeftCorner.Im + IIndex));
                    try
                    {
                        minFactNum = Math.Min(minFactNum, FactorSets[RIndex, IIndex].NumFactors);
                    }
                    catch
                    {
                        MessageBox.Show("NullException in ProdGrid Constructor after call to ComplFactors constructor");
                        //indicate problem during search
                        ProgressReceptor.UpdateProgress(-1);
                    }
                }
                double CurrentProgress = ((RIndex * ArrSize) + IIndex) / ItemsToAnalyze;
                ProgressReceptor.UpdateProgress(CurrentProgress);
            }
            //indicate that searcn is not running anymore
            ProgressReceptor.UpdateProgress(2);
        }
 private void ProdIndicator_Click(object sender, MouseButtonEventArgs e)
 {
     // search for clicked ellipse in array to get the corresponding number
     if (FoundProducts != null)
     {
         SelectedProd = FindIndicator((Ellipse)sender, FoundProducts);
         if (SelectedProd != null) //found?
         {
             // get all factor pairs
             if (Factors != null)
             {
                 ComplFactors CurFactors = Factors.GetFactors(SelectedProd);
                 if (CurFactors != null)
                 {// color all factors w/ equal colors for factor pairs and special markings for "double" factors
                     RecolorFactors(SelectedProd, CurFactors);
                 }
             }
         }
     }
 }
 private void FactIndicator_Click(object sender, MouseButtonEventArgs e)
 {
     if (SelectedProd != null)// react only if previously some number has been selected as product
     {
         // search for clicked ellipse in array to get the corresponding number
         if (FoundFactors != null)
         {
             ComplNum SelectedFactor = FindIndicator((Ellipse)sender, FoundFactors);
             if (SelectedFactor != null)//found?
             {
                 // get all factor pairs
                 if (Factors != null)
                 {
                     ComplFactors CurFactors = Factors.GetFactors(SelectedProd);
                     if (CurFactors != null)
                     {
                         //look if the currently selected number is actually a factor of the previously selected product
                         FactorList CurFactPair = CurFactors.First;
                         //get current necessary thickness of edge to be seen and not be too big.
                         double EdgeThickness = GetCurrentDiameter() * smallmargfract;
                         while (CurFactPair != null) //go through *all* factor pairs to clean up edges from possible previous factor selection
                         {
                             //clean up any previous black edges from non-double factors
                             if (!CurFactPair.val1.Equal(CurFactPair.val2))
                             {
                                 FoundFactors[CurFactPair.val1.Im + size, CurFactPair.val1.Re + size].StrokeThickness = 0;
                                 FoundFactors[CurFactPair.val2.Im + size, CurFactPair.val2.Re + size].StrokeThickness = 0;
                             }
                             // is the lastly selected number part of the current factor pair?
                             if (CurFactPair.val1.Equal(SelectedFactor))
                             {
                                 // only need to do sth if no "double factor"
                                 if (!CurFactPair.val2.Equal(SelectedFactor))
                                 {
                                     // recolor current and corresponding factor's inner edge
                                     SolidColorBrush myBrush = new SolidColorBrush();
                                     myBrush.Color                     = Color.FromRgb(0, 0, 0);
                                     ((Ellipse)sender).Stroke          = myBrush;
                                     ((Ellipse)sender).StrokeThickness = EdgeThickness;
                                     FoundFactors[CurFactPair.val2.Im + size, CurFactPair.val2.Re + size].Stroke          = myBrush;
                                     FoundFactors[CurFactPair.val2.Im + size, CurFactPair.val2.Re + size].StrokeThickness = EdgeThickness;
                                 }
                             }
                             else if (CurFactPair.val2.Equal(SelectedFactor))
                             {
                                 //possibility of "double factor" already excluded
                                 // recolor current and corresponding factor's inner edge
                                 SolidColorBrush myBrush = new SolidColorBrush();
                                 myBrush.Color                     = Color.FromRgb(0, 0, 0);
                                 ((Ellipse)sender).Stroke          = myBrush;
                                 ((Ellipse)sender).StrokeThickness = EdgeThickness;
                                 FoundFactors[CurFactPair.val1.Im + size, CurFactPair.val1.Re + size].Stroke          = myBrush;
                                 FoundFactors[CurFactPair.val1.Im + size, CurFactPair.val1.Re + size].StrokeThickness = EdgeThickness;
                             }
                             else
                             {
                                 //if current selected factor is not part
                             }
                             CurFactPair = CurFactPair.next;
                         }
                     }
                 }
             }
         }
     }
 }
        private void RecolorFactors(ComplNum Prod, ComplFactors Factors)
        {
            if (FoundFactors != null)
            {
                // cleanup before special coloring
                StandardColorFactors();
                StandardOutlineFactors();
                StandardOutlineProducts();
                StandardToolTipFactors();

                //actual re-color action
                double diameter = GetCurrentDiameter();
                // mark the selected product
                if (FoundProducts != null)
                {
                    FoundProducts[Prod.Im + size, Prod.Re + size].StrokeThickness = diameter * smallmargfract;
                }
                //mark factors
                long FactNum = Factors.NumFactors;
                SolidColorBrush[] BrushList = Colors(FactNum);
                long       ColInd           = 0;
                FactorList CurFactPair      = Factors.First;
                while (CurFactPair != null)
                {
                    if (CurFactPair.val1.Equal(CurFactPair.val2))
                    {
                        long i = CurFactPair.val1.Im + size;
                        long j = CurFactPair.val1.Re + size;
                        if (FoundFactors[i, j] != null)
                        {
                            FoundFactors[i, j].StrokeThickness = diameter * smallmargfract;
                            FoundFactors[i, j].Fill            = BrushList[ColInd];
                            FoundFactors[i, j].ToolTip         = "Factor " + CurFactPair.val1.ToString() +
                                                                 " (both factors of " + Prod.ToString() + " identical)";
                        }
                    }
                    else
                    {
                        long i = CurFactPair.val1.Im + size;
                        long j = CurFactPair.val1.Re + size;
                        if (FoundFactors[i, j] != null)
                        {
                            FoundFactors[i, j].Fill = BrushList[ColInd];
                        }
                        FoundFactors[i, j].ToolTip = "Factor " + CurFactPair.val1.ToString() +
                                                     " (corresponding factor of " + Prod.ToString() + ": "
                                                     + CurFactPair.val2.ToString() + ").\n Click to show corresponding factor.";
                        i = CurFactPair.val2.Im + size;
                        j = CurFactPair.val2.Re + size;
                        if (FoundFactors[i, j] != null)
                        {
                            FoundFactors[i, j].Fill = BrushList[ColInd];
                        }
                        FoundFactors[i, j].ToolTip = "Factor " + CurFactPair.val2.ToString() +
                                                     " (corresponding factor of " + Prod.ToString() + ": "
                                                     + CurFactPair.val1.ToString() + ").\n Click to show corresponding factor.";
                    }
                    ColInd++;
                    CurFactPair = CurFactPair.next;
                }
            }
        }