private void CalcCoordsAndUpdate(ColorHandler.HSV HSV) { // Convert color to real-world coordinates and then calculate // the various points. HSV.Hue represents the degrees (0 to 360), // HSV.Saturation represents the radius. // This procedure doesn't draw anything--it simply // updates class-level variables. The UpdateDisplay // procedure uses these values to update the screen. // Given the angle (HSV.Hue), and distance from // the center (HSV.Saturation), and the center, // calculate the point corresponding to // the selected color, on the color wheel. colorPoint = GetPoint((double)HSV.Hue / 255 * 360, (double)HSV.Saturation / 255 * radius, centerPoint); // Given the brightness (HSV.value), calculate the // point corresponding to the brightness indicator. brightnessPoint = CalcBrightnessPoint(HSV.value); // Store information about the selected color. brightness = HSV.value; selectedColor = ColorHandler.HSVtoColor(HSV); RGB = ColorHandler.HSVtoRGB(HSV); // The full color is the same as HSV, except that the // brightness is set to full (255). This is the top-most // color in the brightness gradient. fullColor = ColorHandler.HSVtoColor(HSV.Hue, HSV.Saturation, 255); }
private void HandleHSVScroll(object sender, EventArgs e) // If the H, S, or V values change, use this // code to update the RGB values and invalidate // the color wheel (so it updates the pointers). // Check the isInUpdate flag to avoid recursive events // when you update the NumericUpdownControls. { changeType = ChangeStyle.HSV; hsv = new ColorHandler.HSV(tbAlpha.Value, tbHue.Value, tbSaturation.Value, tbValue.Value); SetRGB(ColorHandler.HSVtoRGB(hsv)); SetHSVLabels(hsv); Invalidate(); }
private void HandleHSVChange(object sender, EventArgs e) { // If the H, S, or V values change, use this // code to update the RGB values and invalidate // the color wheel (so it updates the pointers). // Check the isInUpdate flag to avoid recursive events // when you update the NumericUpdownControls. if (!isInUpdate) { changeType = ChangeStyle.HSV; HSV = new ColorHandler.HSV((int)(nudHue.Value), (int)(nudSaturation.Value), (int)(nudBrightness.Value)); SetRGB(ColorHandler.HSVtoRGB(HSV)); this.Invalidate(); } }
/// <summary> /// The update box. /// </summary> public void updateBox() { colorBox.BackColor = ColorHandler.HSVtoColor(hsvColor); ColorHandler.RGB tempRGB = ColorHandler.HSVtoRGB(hsvColor); updatingColors = true; if (alphaText != null) { alphaText.Text = (this.color.Alpha / 255f).ToString(); } redText.Text = (this.color.Red / 255f).ToString(); greenText.Text = (this.color.Green / 255f).ToString(); blueText.Text = (this.color.Blue / 255f).ToString(); updatingColors = false; }
private void GrabColor(object sender, Point mouseXY) { int cntlNum = this.Controls.IndexOf((Control)sender); int cx = mouseXY.X; int cy = mouseXY.Y; switch (cntlNum) { case 0: // center our coordinate system so the middle is (0,0), and positive Y is facing up cx -= (this.Controls[cntlNum].Width / 2); cy -= (this.Controls[cntlNum].Height / 2); if (cx < this.Controls[cntlNum].Width / 2) { double theta = Math.Atan2(cy, cx); if (theta < 0) { theta += 2 * Math.PI; } double alpha = Math.Sqrt((cx * cx) + (cy * cy)); int h = (int)((theta / (Math.PI * 2)) * 360.0); int s = (int)Math.Min(100.0, (alpha / (double)(this.Controls[0].Width / 2)) * 100); int v = hsvColor.value; hsvColor = new ColorHandler.HSV(h, s, v); OnColorChanged(); updateBar(); } break; case 1: if (cx < this.Controls[cntlNum].Width) { hsvColor.value = Math.Max(0, Math.Min(100, 100 - (cy * 100 / this.Controls[cntlNum].Height))); updateBox(); } break; } this.color = ColorHandler.HSVtoRGB(hsvColor); Invalidate(true); }
public void Draw(Graphics g, Point mousePoint) { // You've moved the mouse. // Now update the screen to match. double distance; int degrees; Point delta; Point newColorPoint; Point newBrightnessPoint; Point newPoint; // Keep track of the previous color pointer point, // so you can put the mouse there in case the // user has clicked outside the circle. newColorPoint = colorPoint; newBrightnessPoint = brightnessPoint; // Store this away for later use. this.g = g; if (currentState == MouseState.MouseUp) { if (!mousePoint.IsEmpty) { if (colorRegion.IsVisible(mousePoint)) { // Is the mouse point within the color circle? // If so, you just clicked on the color wheel. currentState = MouseState.ClickOnColor; } else if (brightnessRegion.IsVisible(mousePoint)) { // Is the mouse point within the brightness area? // You clicked on the brightness area. currentState = MouseState.ClickOnBrightness; } else { // Clicked outside the color and the brightness // regions. In that case, just put the // pointers back where they were. currentState = MouseState.ClickOutsideRegion; } } } switch (currentState) { case MouseState.ClickOnBrightness: case MouseState.DragInBrightness: // Calculate new color information // based on the brightness, which may have changed. newPoint = mousePoint; if (newPoint.Y < brightnessMin) { newPoint.Y = brightnessMin; } else if (newPoint.Y > brightnessMax) { newPoint.Y = brightnessMax; } newBrightnessPoint = new Point(brightnessX, newPoint.Y); brightness = (int)((brightnessMax - newPoint.Y) * brightnessScaling); HSV.value = brightness; RGB = ColorHandler.HSVtoRGB(HSV); break; case MouseState.ClickOnColor: case MouseState.DragInColor: // Calculate new color information // based on selected color, which may have changed. newColorPoint = mousePoint; // Calculate x and y distance from the center, // and then calculate the angle corresponding to the // new location. delta = new Point( mousePoint.X - centerPoint.X, mousePoint.Y - centerPoint.Y); degrees = CalcDegrees(delta); // Calculate distance from the center to the new point // as a fraction of the radius. Use your old friend, // the Pythagorean theorem, to calculate this value. distance = Math.Sqrt(delta.X * delta.X + delta.Y * delta.Y) / radius; if (currentState == MouseState.DragInColor) { if (distance > 1) { // Mouse is down, and outside the circle, but you // were previously dragging in the color circle. // What to do? // In that case, move the point to the edge of the // circle at the correct angle. distance = 1; newColorPoint = GetPoint(degrees, radius, centerPoint); } } if (distance > 1) { distance = 1; } // Calculate the new HSV and RGB values. HSV.Hue = (int)(degrees * 255 / 360); HSV.Saturation = (int)(distance * 255); HSV.value = brightness; RGB = ColorHandler.HSVtoRGB(HSV); fullColor = ColorHandler.HSVtoColor(HSV.Hue, HSV.Saturation, 255); break; } selectedColor = ColorHandler.HSVtoColor(HSV); // Raise an event back to the parent form, // so the form can update any UI it's using // to display selected color values. OnColorChanged(RGB, HSV); // On the way out, set the new state. switch (currentState) { case MouseState.ClickOnBrightness: currentState = MouseState.DragInBrightness; break; case MouseState.ClickOnColor: currentState = MouseState.DragInColor; break; case MouseState.ClickOutsideRegion: currentState = MouseState.DragOutsideRegion; break; } // Store away the current points for next time. colorPoint = newColorPoint; brightnessPoint = newBrightnessPoint; // Draw the gradients and points. UpdateDisplay(); }