public StripedPath this[int i] { get { if (dbugSettings.makeVariations) { return(new StripedPath() { stripeField = debugStripeField(i), path = paths[i] }); } StripeField sfield = null; if (diamondCalculator.getStripeFieldIterator(new PathData(paths[i]), out sfield)) { return(new StripedPath() { stripeField = sfield, path = paths[i], }); } return(new StripedPath()); } }
//CONSIDER: analyze all of the paths and gen StripeFields based on some global data public bool getStripeFieldIterator(PathData pdata, out StripeField sfield) { float value = ColorUtil.valueFromUIntColor(pdata.path.fillColor); float lightRatio = stripeFieldConfig.lightAreaRatio(value); int lineCount = stripeFieldConfig.lineCountForLightRatio(lightRatio); float darkRatio = 1f - lightRatio; if (lineCount == 0) { sfield = new StripeField(); return(false); } Vector2f primary = pdata.bounds.tallerThanWide ? pdata.highest - pdata.lowest : pdata.rightMost - pdata.leftMost; float priAngle = Mathf.PI * 2f / 3f; // Mathf.Atan2(primary.y, primary.x); priAngle = Mathf.Abs(priAngle); Vector2f sz = pdata.bounds.size; float diamondAngle = Mathf.PI / 6f; // priAngle + pdata.bounds.smallerOverLargerDimension * Mathf.PI / 2.5f; //TODO: determine angle somehow // make sure diamond is sub 90 degrees? Vector2f secondary = new Vector2f(Mathf.Cos(diamondAngle), Mathf.Sin(diamondAngle)); float targetWidth = stripeFieldConfig.targetWidthForValue(darkRatio); float targetArea = targetWidth * targetWidth; // stripeFieldConfig.referenceArea(lightRatio); if (targetArea < Mathf.Epsilon) { sfield = new StripeField() { angleRadians = priAngle, interval = stripeFieldConfig.lineWidth }; return(true); } float mult = Mathf.Sqrt(targetArea / Mathf.Max(Mathf.Abs(secondary.y), 0.0001f)); primary.Normalize(); float interval = secondary.y * mult; secondary = new Matrix2f(priAngle) * secondary; StripeField _next = new StripeField() { angleRadians = diamondAngle, interval = interval }; if (dbugSettings.hatchCount == 1) { sfield = _next; return(true); } sfield = new StripeField() { angleRadians = priAngle, interval = interval, next = _next }; return(true); }