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