I have defined a color palette called tableau10 in Clingo:
tableau10(blue;orange;red;teal;green;yellow;purple;pink;brown;gray).
Is there a way to compare the colors by the order they appear in my color definition? (e.g., blue = 0, orange = 1, red = 2, ...)
My goal is to be able to claim things like blue < orange, blue < gray...
The predicate tableau10 is unordered. To do such comparisons you'd have to encode order in one way or another. You could for example assign numbers to the colors value(blue, 1). value(orange, 2). ... and compare the associated numbers when necessary, or you could write lessthan(blue, orange). lessthan(orange, red). ... lessthan(brown,gray). and also add the transitivity rule lessthan(A, C) :- lessthan(A, B), lessthan(B, C).
Related
Assuming I have a list of objects from the type shirt, and each shirt has a color property.
Is there a way to create a rule which will get only shirts of the same color (no matter what the color is)?
You're looking for the collect function. (Link is to the Drools documentation, scroll down a bit to find "collect".) Like its name indicates, it collects things that match a condition.
Let's assume a simple class Shirt with a String color variable. Let's also assume that there are a variety of shirt instances in working memory.
rule "Collect shirts by color"
when
Shirt( $color: color )
$shirts: List() from collect( Shirt( color === $color ) )
then
// $shirts will now contain all shirts of $color
end
This rule will individually consider each shirt, and then collect all of the other shirts which have the same color. So if you have Red, Blue, and Green shirts, you'll enter the right hand side at least once with $shirts of that single color.
Of course the problem here is that you'll trigger the rule on a per-shirt basis instead of on a per-color basis. So if you have two Red shirts, you'll trigger the 'then' clause with all red shirt twice (once for each red shirt, since each red shirt will independently meet the first criteria.)
If you don't mind this, then you can use this as-is. But if you just want your consequences to fire once per shirt color, we have to be a bit more tricksy.
In order for colors to be the first class citizen, we'll need to extract the distinct set (not list!) of shirt colors, and then use those to collect our lists as needed. Here I use the accumulate function; you can read more about that at the same link I shared previously to the Drools documentation (accumulate is directly after collect.)
rule "Get shirt colors"
when
// Get all unique shirt colors
$colors: Set() from accumulate( Shirt( $color: color), collectSet( $color ))
// Get one of those colors
$color: String() from $colors
// Find all shirts of that color
$shirts: List() from collect( Shirt( color === $color ) )
then
// $shirts is all shirts of $color
end
In this second rule, you will only trigger the right hand side once per color because we started by distilling all possible colors into a distinct set of unique ones.
Doing the opposite is even simpler. If all you need to do is confirm there is at least one shirt that is not the same color, we just need to get all of the colors and verify that there's at least 2 different colors present.
rule "At least one shirt of a different color"
when
$colors: Set( size > 1 ) from accumulate(
Shirt( $color: color),
collectSet( $color )
)
then
// $colors contains more than 1 color, so there's at
// least 1 shirt present that is not the same color
// as the rest
end
I have a stacked bar chart that only ever has 5 categories(but the value of the categories change from year to year, it is a sliding 5 year window).
I have successful customised the bars to the colors I want.
But now I wish to make the label of each Category the same color as the customised bar color.
Is there a way to do this?
You can use custom code for this.
In Report Properties | Code, you can paste in the following code:
Private colourPalette As String() = {"#418CF0", "#FCB441", "#DF3A02", "#056492", "#BFBFBF", "#1A3B69", "#FFE382", "#129CDD", "#CA6B4B", "#005CDB", "#F3D288", "#506381", "#F1B9A8", "#E0830A", "#7893BE"}
Private count As Integer = 0
Private mapping As New System.Collections.Hashtable()
Public Function GetColour(ByVal groupingValue As String) As String
If mapping.ContainsKey(groupingValue) Then
Return mapping(groupingValue)
End If
Dim c As String = colourPalette(count Mod colourPalette.Length)
count = count + 1
mapping.Add(groupingValue, c)
Return c
End Function
This will give you the option of the pastel colour palette. If you want other colours, simply replace the hex colour codes with values of your choice.
To use this, simply use the following expression:
=Code.GetColour(Fields!Thingy.Value)
Use this on your series and your label fill expressions. This will ensure that the same colour appears for both. If you have multiple graphs with the same values in, this will also ensure that the same data series across multiple graphs always have the same colour.
I'm trying to iterate through a column in numbers and change the background color of a cell, if the cell has a certain background color.
repeat with i from 11 to the count of cells by 6
if background color of cell i is {17990, 47031, 42919} then
set background color of cell i to {65535, 0, 0}
end if
end repeat
unfortunately, this does not do anything. The script just stops without Error. Help please!
There seems to be a bug in Numbers app where is not reporting the colors correctly. I set the background colors of columns A and B to your chosen value {17990, 47031, 42919}, but when I asked the script to return the colors, it returned the value {17990, 47030, 42919}. Because of this, I had the script check for both values and to act accordingly.
I added a dialog pop-up giving you the option to choose which column to change the cell colors.
tell application "Numbers"
set ifColor to {17990, 47031, 42919}
set ifColor2 to {17990, 47030, 42919}
set changeToColor to {65535, 0, 0}
tell its document 1
set theColumns to name of columns of table "Table 1" of active sheet
set chosenColumn to item 1 of (choose from list theColumns with title "Choose The Column" with prompt "Choose The Column")
set cellCount to count of cells of column chosenColumn of table "Table 1" of active sheet
repeat with i from 11 to cellCount by 6
set thisCell to cell ((chosenColumn & i) as string) of table "Table 1" of active sheet
if background color of thisCell is ifColor or background color of thisCell is ifColor2 then
set background color of thisCell to changeToColor
end if
end repeat
end tell
end tell
Here's the table I started with, having coloured the background of one cell magenta, i.e. {65535,0,65535}.
Then I ran this code:
use NumbersApp : application "Numbers"
property document : a reference to document 1 of NumbersApp
property sheet : a reference to active sheet of my document
property table : a reference to table 1 of my sheet
repeat with c in (a reference to every cell of my table)
if c's background color = missing value then ¬
set c's background color to {65535, 65535, 0}
if c's background color = {65535, 0, 65535} then ¬
set c's background color to {65535, 65535, 65535}
end repeat
I was expecting the majority of cells to turn yellow, and my magenta cell to turn white:
Hm...
My magenta cell is still looking far too magenta. So I decided to check just how magenta it really is:
return the background color of cell "C7" of my table
--> {64587, 609, 65480}
Well, that's not what I set it to, but it's pretty magenta, though I now see why it didn't turn white.
Next I decided to check the background colour of one of the yellow cells, that you have just seen me programmatically turn to a very specific kind of yellow:
return the background color of cell "D10" in my table
--> {65534, 65531, 2689}
Again, it is yellow, but not the yellow I told it to be.
Finally, I used the colour value just returned to try and target those cells and turn them black:
set the background color of every cell in my table ¬
whose background color is {65534, 65531, 2689} ¬
to {0, 0, 0}
Zilch. They are still very sunnily yellow.
Conclusion
Bug in AppleScript. I've submitted a bug report to Apple. I suggest you do the same.
#wch1zpink: {17990, 47031, 42919} --> {17990, 47030, 42919}
Looks like a rounding error introduced when converting integers to floating point numbers and back again. (AppleScript dates from the days of QuickDraw, which represented RGB values as UInt16, whereas Numbers is a Cocoa app, and Cocoa's NSColor uses CGFloat.) That's unavoidable, being a fundamental limitation of how CPUs do math (e.g. 0.7 * 0.7 = 0.49 --> false!).
The solution is to check the numbers are equal within an acceptable margin of error:
on areRealsEqual(n1, n2, toleranceMargin)
return n1 > n2 - toleranceMargin and n1 < n2 + toleranceMargin
end areRealsEqual
on areColorsEqual(c1, c2)
repeat with i from 1 to length of c1
if not areRealsEqual(item i of c1, item i of c2, 5) then return false
end repeat
return true
end areColorsEqual
set expectedColor to {17990, 47031, 42919}
set foundColor to {17990, 47030, 42919}
areColorsEqual(expectedColor, foundColor)
--> true
I have this mini task in my game where you need to click trophies to change color of the wood on them. I have two arrays of colors, one is an array containing all possible colors and the other one contains four colors (the answer) as follows:
I've double checked that the colors are equal between the two arrays. For example the purple in Colors-array has exactly the same r, g, b & a values as the purple in the Right Order-array.
To check whether the trophies has correct color I just loop through them and grab their material color. Then I check that color against the Right Order-array but it's not quite working. For example when my first trophy is purple it should be correct, but it's not because for some reason Unity is returning slightly different material color than excepted:
Hope somebody knows why this is happening.
When you say, they are exactly same color, I assume you are referring rgb values from Color Inspector, which are not precise values.
Now I dont know what could be causing in different values of colors but
You can write an extension method to compare the values after rounding them to closest integer.
public static class Extensions
{
public static bool CompareRGB(this Color thisColor, Color otherColor)
{
return
Mathf.RoundToInt(thisColor.r * 255) == Mathf.RoundToInt(otherColor.r * 255) &&
Mathf.RoundToInt(thisColor.b * 255) == Mathf.RoundToInt(otherColor.b * 255) &&
Mathf.RoundToInt(thisColor.g * 255) == Mathf.RoundToInt(otherColor.g * 255);
}
}
usage:
Color red = Color.Red;
red.CompareRGB(Color.Red); // true;
red.CompareRGB(Color.Green); // false;
Hope this helps.
I would use a palette. This is simply an array of all the possible colors you use (sounds like you have this). Record, for each "trophy", the INDEX into this array, at the same time you assign the color to the renderer. Also, record the index for each "button", at the same time you assign the color to the renderer.
Then you can simply compare the palette index values (simple integers) to see if the color matches.
I am not sure if this is possible as I have been looking for a few hours and cant find what I am looking for.
What i am doing is taking a color from a game panel which is semi translucent so the color which I am taking is always subtly changing. What is need is a way to check if it is +/- 10 or so shades of my desired color.
Something like
If color1 is +/-10 of 0x?
I have tried using the image search to do similar but that didn't work.
Any help would be greatly appreciated
In addition to Robert's answer, you can compare the colors mathematically.
First start by separating the Red, Green, and Blue values.
ToRGB(color) {
return { "r": (color >> 16) & 0xFF, "g": (color >> 8) & 0xFF, "b": color & 0xFF }
}
Then we need a function that compares the colors. Each of thee variables holds a number representing the difference in the two color values. For example if red is 255 in c1, and 200 in c2, rdiff will be 55. We use Abs so that we don't end up with -55 when c2 has a higher value. Then we make sure the difference for each of these is less than our vary.
Compare(c1, c2, vary=20) {
rdiff := Abs( c1.r - c2.r )
gdiff := Abs( c1.g - c2.g )
bdiff := Abs( c1.b - c2.b )
return rdiff <= vary && gdiff <= vary && bdiff <= vary
}
Here's how it can be used. We take some numbers, and then compare them to each other with the default vary of 20.
light_pink := ToRGB(0xFFAAFF)
darker_pink := ToRGB(0xFAACEF)
purple := ToRGB(0xAA00FF)
MsgBox % Compare(light_pink, dark_pink) ; True
MsgBox % Compare(light_pink, purple) ; False
I assume that your read about the limitations of PixelGetColor: Known limitations:
"A window that is partially transparent or that has one of its colors marked invisible (TransColor) typically yields colors for the window behind itself rather than its own.
PixelGetColor might not produce accurate results for certain applications. If this occurs, try specifying the word Alt or Slow in the last parameter."
When using ImageSearch, you can specify the Delta of the colours. Example:
ImageSearch, FoundX, FoundY, %SearchRangeLeft%, %SearchRangeTop%, %SearchRangeRight%, %SearchRangeBottom%, *20 %ImageFile%
Here the *20 indicates the variation in the range from 0 to 255 of my search colour. When searching for a pixel inside the image of 100,100,100 (RGB), it will match anything between 80,80,80 and 120,120,120. Hope this helps, but matching transparent colours is difficult and prone to errors. The smaller the image and search range the better (and faster)