public override void Apply(SvgDocument SvgDocument) { NumStripes = GetNumStripes(); Color[] stripeColors = new Color[NumStripes]; StripeDirection = GetStripeDirection(); EvenStripes = NumStripes % 2 == 0; bool alternate = R.NextDouble() < ALTERNATING_COLORS_CHANCE; // Get stripe colors if (alternate) // Alternating colored stripes { Color c1 = ColorManager.GetRandomColor(); Color c2 = ColorManager.GetRandomColor(new List <Color>() { c1 }); for (int i = 0; i < NumStripes; i++) { stripeColors[i] = i % 2 == 0 ? c1 : c2; } } else if (!EvenStripes && R.NextDouble() < UNEVEN_SYMMETRY_CHANCE) // Symmetrical colored stripes { for (int i = 0; i < NumStripes; i++) { if (i < (NumStripes + 1) / 2) { stripeColors[i] = ColorManager.GetRandomColor(stripeColors.Where(x => x != null).ToList()); } else { stripeColors[i] = stripeColors[NumStripes - 1 - i]; } } } else // All stripes different color { for (int i = 0; i < NumStripes; i++) { stripeColors[i] = ColorManager.GetRandomColor(stripeColors.Where(x => x != null).ToList()); } } float[] stripeSizes = new float[NumStripes]; // Stripe size (0-1) if (!EvenStripes && R.NextDouble() < WIDE_MID_STRIPE_CHANCE) { float midStripeSize = RandomRange(MIN_MID_STRIPE_SIZE, MAX_MID_STRIPE_SIZE); float otherStripesSize = (1f - midStripeSize) / (NumStripes - 1); for (int i = 0; i < NumStripes; i++) { if (i == NumStripes / 2) { stripeSizes[i] = midStripeSize; } else { stripeSizes[i] = otherStripesSize; } } } else { for (int i = 0; i < NumStripes; i++) { stripeSizes[i] = 1f / NumStripes; } } // Draw stripes float curRel = 0; for (int i = 0; i < NumStripes; i++) { float stripeSize = stripeSizes[i]; DrawRectangle(SvgDocument, StripeDirection == StripeDirectionType.Horizontal ? 0 : curRel *FlagWidth, StripeDirection == StripeDirectionType.Horizontal ? curRel *FlagHeight : 0, StripeDirection == StripeDirectionType.Horizontal ? FlagWidth : FlagWidth *stripeSize, StripeDirection == StripeDirectionType.Horizontal ? FlagHeight *stripeSize : FlagHeight, stripeColors[i]); curRel += stripeSize; } CoatOfArmsChance = COAT_OF_ARMS_CHANCE; float minCoaSize = 0, maxCoaSize = 0; // Absolute size switch (GetOverlayType()) { case OverlayType.None: if (!EvenStripes && R.NextDouble() < MID_STRIPE_SYMBOLS_CHANCE) { CoatOfArmsChance = 0f; int numSymbols = RandomRange(MID_STRIPE_SYMBOLS_MIN_AMOUNT, MID_STRIPE_SYMBOLS_MAX_AMOUNT + 1); Color symbolColor = ColorManager.GetRandomColor(new List <Color>() { stripeColors[NumStripes / 2] }); float midStripeWidth = stripeSizes[(NumStripes / 2)]; float minSymbolRelSize = Math.Min(midStripeWidth, 0.1f); float maxSymbolRelSize = Math.Min(midStripeWidth, 1f / (numSymbols + 1)); float symbolRelSize = RandomRange(minSymbolRelSize, maxSymbolRelSize); Symbol symbol = GetRandomSymbol(); float relStepSize = 1f / (numSymbols + 1); for (int i = 0; i < numSymbols; i++) { PointF position = new PointF(StripeDirection == StripeDirectionType.Horizontal ? (i + 1) * relStepSize * FlagWidth : FlagCenter.X, StripeDirection == StripeDirectionType.Horizontal ? FlagCenter.Y : (i + 1) * relStepSize * FlagHeight); symbol.Draw(SvgDocument, this, position, StripeDirection == StripeDirectionType.Horizontal ? symbolRelSize * FlagHeight : symbolRelSize * FlagHeight, 0, symbolColor); } } else // Coat of arms { CoatOfArmsPosition = FlagCenter; List <Color> forbiddenCoaColors = EvenStripes ? new List <Color>() { stripeColors[NumStripes / 2 - 1], stripeColors[NumStripes / 2] } : new List <Color>() { stripeColors[NumStripes / 2] }; float coaSizeRel = EvenStripes ? stripeSizes[0] * 2 : stripeSizes[NumStripes / 2]; if (!EvenStripes && R.NextDouble() < BIG_COA_CHANCE) { coaSizeRel = stripeSizes[(NumStripes / 2) - 1] + stripeSizes[(NumStripes / 2)] + stripeSizes[(NumStripes / 2) + 1]; forbiddenCoaColors.Add(stripeColors[(NumStripes / 2) - 1]); forbiddenCoaColors.Add(stripeColors[(NumStripes / 2) + 1]); } CoatOfArmsSize = StripeDirection == StripeDirectionType.Horizontal ? coaSizeRel * FlagHeight : coaSizeRel * FlagWidth; CoatOfArmsSize = Math.Min(FlagHeight, CoatOfArmsSize); CoatOfArmsSize *= 0.9f; CoatOfArmsColor = ColorManager.GetRandomColor(forbiddenCoaColors); } break; case OverlayType.TopRightSquare: List <Color> forbiddenColors = new List <Color>(); for (int i = 0; i <= NumStripes / 2; i++) { forbiddenColors.Add(stripeColors[i]); } Color squareColor = ColorManager.GetRandomColor(forbiddenColors); DrawRectangle(SvgDocument, 0, 0, FlagWidth / 2, FlagHeight / 2, squareColor); // Coa CoatOfArmsPosition = new PointF(FlagWidth / 4, FlagHeight / 4); minCoaSize = FlagHeight / 4; maxCoaSize = FlagHeight / 2; CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { squareColor }); break; case OverlayType.LeftTriangle: Color triangleColor = ColorManager.GetRandomColor(stripeColors.ToList()); float triangleWidth = RandomRange(LEFT_TRIANGLE_MIN_WIDTH, LEFT_TRIANGLE_MAX_WIDTH); PointF[] vertices = new PointF[] { new PointF(0, 0), new PointF(triangleWidth * FlagWidth, FlagHeight / 2), new PointF(0, FlagHeight) }; DrawPolygon(SvgDocument, vertices, triangleColor); // Coa CoatOfArmsPosition = new PointF((triangleWidth * 0.35f) * FlagWidth, FlagHeight / 2); minCoaSize = (triangleWidth * 0.3f) * FlagWidth; maxCoaSize = (triangleWidth * 0.6f) * FlagWidth; CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { triangleColor }); break; case OverlayType.Antigua: Color overlayColor = ColorManager.GetRandomColor(stripeColors.ToList()); PointF[] triangle1 = new PointF[] { new PointF(0, 0), new PointF(FlagWidth / 2, FlagHeight), new PointF(0, FlagHeight) }; PointF[] triangle2 = new PointF[] { new PointF(FlagWidth, 0), new PointF(FlagWidth / 2, FlagHeight), new PointF(FlagWidth, FlagHeight) }; DrawPolygon(SvgDocument, triangle1, overlayColor); DrawPolygon(SvgDocument, triangle2, overlayColor); // Coa float height = RandomRange(0.2f, 0.4f); CoatOfArmsPosition = new PointF(FlagWidth / 2, height * FlagHeight); minCoaSize = 0.2f * FlagHeight; maxCoaSize = Math.Min(0.5f, height * 2f) * FlagHeight; CoatOfArmsColor = ColorManager.GetRandomColor(stripeColors.ToList()); break; } if (CoatOfArmsSize == 0) { CoatOfArmsSize = RandomRange(minCoaSize, maxCoaSize); } ApplyCoatOfArms(SvgDocument); }
public override void Apply(SvgDocument SvgDocument) { float minCoaSize = 0.5f; float maxCoaSize = 0.95f; CoatOfArmsSize = RandomRange(minCoaSize * FlagHeight, maxCoaSize * FlagHeight); CoatOfArmsPosition = FlagCenter; CoatOfArmsChance = SPLIT_COA_CHANCE; switch (GetRandomStyle()) { case Style.Split: Color c1 = ColorManager.GetRandomColor(); Color c2 = ColorManager.GetRandomColor(new List <Color>() { c1 }); CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { c1, c2 }); PointF[] triangle1 = new PointF[] { new PointF(0, 0), new PointF(FlagWidth, 0), new PointF(0, FlagHeight) }; PointF[] triangle2 = new PointF[] { new PointF(0, FlagHeight), new PointF(FlagWidth, 0), new PointF(FlagWidth, FlagHeight) }; DrawPolygon(SvgDocument, triangle1, c1); DrawPolygon(SvgDocument, triangle2, c2); // Double Split if (R.NextDouble() < DOUBLE_SPLIT_CHANCE) { Color c3 = ColorManager.GetRandomColor(new List <Color>() { c1, c2 }); float minSplit2Start = 0.2f; float maxSplit2Start = 0.6f; float split2Start = RandomRange(minSplit2Start, maxSplit2Start); PointF[] triangle3 = new PointF[] { new PointF(FlagWidth * split2Start, FlagHeight), new PointF(FlagWidth, FlagHeight * split2Start), new PointF(FlagWidth, FlagHeight) }; DrawPolygon(SvgDocument, triangle3, c3); CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { c1 }); minCoaSize = 0.2f; maxCoaSize = 0.5f; CoatOfArmsSize = RandomRange(FlagHeight * minCoaSize, FlagHeight * maxCoaSize); CoatOfArmsPosition = new PointF(50 + CoatOfArmsSize / 2, 50 + CoatOfArmsSize / 2); } // Top right coa if (R.NextDouble() < TOP_RIGHT_COA_CHANCE) { CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { c1 }); minCoaSize = 0.2f; maxCoaSize = 0.5f; CoatOfArmsSize = RandomRange(FlagHeight * minCoaSize, FlagHeight * maxCoaSize); CoatOfArmsPosition = new PointF(50 + CoatOfArmsSize / 2, 50 + CoatOfArmsSize / 2); } break; case Style.Cross: Color bg = ColorManager.GetRandomColor(); Color crossColor = ColorManager.GetRandomColor(new List <Color>() { bg }); DrawRectangle(SvgDocument, 0, 0, FlagWidth, FlagHeight, bg); float crossWidth = RandomRange(MIN_CROSS_WIDTH, MAX_CROSS_WIDTH); float crossWidthAbsX = crossWidth * FlagWidth; float crossWidthAbsY = crossWidth * FlagHeight; if (R.NextDouble() < CROSS_DIFFERENT_SIDE_COLORS_CHANCE) { Color sideColor = ColorManager.GetRandomColor(new List <Color>() { bg, crossColor }); PointF[] leftTriangle = new PointF[] { new PointF(0, 0), FlagCenter, new PointF(0, FlagHeight) }; PointF[] rightTriangle = new PointF[] { new PointF(FlagWidth, 0), FlagCenter, new PointF(FlagWidth, FlagHeight) }; DrawPolygon(SvgDocument, leftTriangle, sideColor); DrawPolygon(SvgDocument, rightTriangle, sideColor); } PointF[] cross1Vertices = new PointF[] { new PointF(0, 0), new PointF(crossWidthAbsX, 0), new PointF(FlagWidth, FlagHeight - crossWidthAbsY), new PointF(FlagWidth, FlagHeight), new PointF(FlagWidth - crossWidthAbsX, FlagHeight), new PointF(0, crossWidthAbsY) }; PointF[] cross2Vertices = new PointF[] { new PointF(0, FlagHeight), new PointF(0, FlagHeight - crossWidthAbsY), new PointF(FlagWidth - crossWidthAbsX, 0), new PointF(FlagWidth, 0), new PointF(FlagWidth, crossWidthAbsY), new PointF(crossWidthAbsX, FlagHeight) }; DrawPolygon(SvgDocument, cross1Vertices, crossColor); DrawPolygon(SvgDocument, cross2Vertices, crossColor); if (R.NextDouble() < INNER_CROSS_CHANCE) { Color innerCrossColor = ColorManager.GetRandomColor(new List <Color>() { crossColor }); float innerCrossWidth = RandomRange(crossWidth * 0.2f, crossWidth * 0.8f); float innerCrossWidthAbsX = innerCrossWidth * FlagWidth; float innerCrossWidthAbsY = innerCrossWidth * FlagHeight; PointF[] innerCross1Vertices = new PointF[] { new PointF(0, 0), new PointF(innerCrossWidthAbsX, 0), new PointF(FlagWidth, FlagHeight - innerCrossWidthAbsY), new PointF(FlagWidth, FlagHeight), new PointF(FlagWidth - innerCrossWidthAbsX, FlagHeight), new PointF(0, innerCrossWidthAbsY) }; PointF[] innerCross2Vertices = new PointF[] { new PointF(0, FlagHeight), new PointF(0, FlagHeight - innerCrossWidthAbsY), new PointF(FlagWidth - innerCrossWidthAbsX, 0), new PointF(FlagWidth, 0), new PointF(FlagWidth, innerCrossWidthAbsY), new PointF(innerCrossWidthAbsX, FlagHeight) }; DrawPolygon(SvgDocument, innerCross1Vertices, innerCrossColor); DrawPolygon(SvgDocument, innerCross2Vertices, innerCrossColor); } CoatOfArmsChance = 0f; break; } ApplyCoatOfArms(SvgDocument); }
private const float MAX_DIAMOND_FRAME_SIZE = 0.3f; // relative to flag height public override void Apply(SvgDocument SvgDocument) { Style style = GetRandomStyle(); CoatOfArmsChance = 1f; CoatOfArmsPosition = FlagCenter; Color bgColor, secColor; float minCoaSizeRel = 0, maxCoaSizeRel = 0; switch (style) { case Style.Plain: bgColor = ColorManager.GetRandomColor(); CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { bgColor }); minCoaSizeRel = 0.6f; maxCoaSizeRel = 0.95f; DrawRectangle(SvgDocument, 0, 0, FlagWidth, FlagHeight, bgColor); break; case Style.Frame: bgColor = ColorManager.GetRandomColor(); secColor = ColorManager.GetRandomColor(new List <Color>() { bgColor }); CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { secColor }); float frameHeightRel = RandomRange(MIN_FRAME_SIZE, MAX_FRAME_SIZE); float frameSize = frameHeightRel * FlagHeight; DrawRectangle(SvgDocument, 0, 0, FlagWidth, FlagHeight, bgColor); // Frame DrawRectangle(SvgDocument, frameSize, frameSize, FlagWidth - 2 * frameSize, FlagHeight - 2 * frameSize, secColor); minCoaSizeRel = 0.3f; maxCoaSizeRel = 1f - (2f * frameHeightRel); break; case Style.Diamond: bgColor = ColorManager.GetRandomColor(); secColor = ColorManager.GetRandomColor(new List <Color>() { bgColor }); CoatOfArmsColor = ColorManager.GetRandomColor(new List <Color>() { secColor }); float frameSizeXRel = RandomRange(0f, MAX_DIAMOND_FRAME_SIZE); float frameSizeYRel = RandomRange(0f, MAX_DIAMOND_FRAME_SIZE); float frameSizeX = frameSizeXRel * FlagWidth; float frameSizeY = frameSizeYRel * FlagHeight; DrawRectangle(SvgDocument, 0, 0, FlagWidth, FlagHeight, bgColor); // Frame PointF[] vertices = new PointF[] { new PointF(FlagWidth / 2, frameSizeY), new PointF(FlagWidth - frameSizeX, FlagHeight / 2), new PointF(FlagWidth / 2, FlagHeight - frameSizeY), new PointF(frameSizeX, FlagHeight / 2) }; DrawPolygon(SvgDocument, vertices, secColor); minCoaSizeRel = 0.3f; maxCoaSizeRel = 1f - (3 * Math.Max(frameSizeXRel, frameSizeYRel)); break; } float minCoaSize = FlagHeight * minCoaSizeRel; float maxCoaSize = FlagHeight * maxCoaSizeRel; CoatOfArmsSize = RandomRange(minCoaSize, maxCoaSize); ApplyCoatOfArms(SvgDocument); }