/// <summary> /// Initializes the noise table /// </summary> /// <param name="_TableSize"></param> /// <param name="_GradientSeed"></param> /// <param name="_PermutationSeed"></param> public void Init(int _TableSize, int _GradientSeed, int _PermutationSeed) { m_NoiseSize = (uint)_TableSize; Random GradientRNG = new Random(_GradientSeed); Random PermutationRNG = new Random(_PermutationSeed); // Build the noise & permutation tables m_NoiseTable = new WMath.Vector4D[2 * m_NoiseSize]; m_PermutationTable = new uint[2 * m_NoiseSize]; for (uint SlotIndex = 0; SlotIndex < m_NoiseSize; SlotIndex++) { m_NoiseTable[SlotIndex] = m_NoiseTable[m_NoiseSize + SlotIndex] = new WMath.Vector4D(2.0f * (float)GradientRNG.NextDouble() - 1.0f, 2.0f * (float)GradientRNG.NextDouble() - 1.0f, 2.0f * (float)GradientRNG.NextDouble() - 1.0f, 2.0f * (float)GradientRNG.NextDouble() - 1.0f); m_PermutationTable[SlotIndex] = SlotIndex; } // Mix the permutation table by exchanging indices at random for (uint SlotIndex = 0; SlotIndex < m_NoiseSize; SlotIndex++) { uint RandomIndex = (uint)PermutationRNG.Next((int)m_NoiseSize); uint Temp = m_PermutationTable[RandomIndex]; m_PermutationTable[RandomIndex] = m_PermutationTable[SlotIndex]; m_PermutationTable[SlotIndex] = Temp; } // Finalize the permutation table by doubling its size for (uint SlotIndex = 0; SlotIndex < m_NoiseSize; SlotIndex++) { m_PermutationTable[m_NoiseSize + SlotIndex] = m_PermutationTable[SlotIndex]; } }
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.FillRectangle(Brushes.Black, 0, 0, Width, Height); if (m_SourceImage != null) { e.Graphics.DrawImage(m_SourceImage, ImageClientRectangle, new RectangleF(0, 0, m_SourceImage.Width, m_SourceImage.Height), GraphicsUnit.Pixel); } // Show custom swatches' location RectangleF R = ImageClientRectangle; for (int SwatchIndex = 0; SwatchIndex < m_CustomSwatches.Length; SwatchIndex++) { if (m_CustomSwatches[SwatchIndex] != null) { WMath.Vector4D Location = m_CustomSwatches[SwatchIndex]; PointF TopLeft = new PointF(R.Left + Location.x * R.Width, R.Top + Location.y * R.Height); PointF BottomRight = new PointF(R.Left + Location.z * R.Width, R.Top + Location.w * R.Height); e.Graphics.DrawRectangle(Pens.Red, TopLeft.X, TopLeft.Y, 1 + BottomRight.X - TopLeft.X, 1 + BottomRight.Y - TopLeft.Y); e.Graphics.DrawString(SwatchIndex.ToString(), Font, Brushes.Red, 0.5f * (TopLeft.X + BottomRight.X - Font.Height), 0.5f * (TopLeft.Y + BottomRight.Y - Font.Height)); } } }
protected float Dot(WMath.Vector4D _Op0, float _Op1x, float _Op1y, float _Op1z, float _Op1w) { return(_Op0.x * _Op1x + _Op0.y * _Op1y + _Op0.z * _Op1z + _Op0.w * _Op1w); }