April 29, 2011

RhinoScript | Rainbow color RGB table

라이노 스크립트로 컬러 그라데이션을 나타내려고 할때 빨강에서 파랑으로 변하는 색을 제대로 표현하지 못해 애먹은 기억이 있다. Red에서 Blue로 변화되는 색상을 어레이로 출력해주는Function을 만들어 보았다.


첫번째 Fucntion은 Red Yellow Green Cyan Blue 사이를각 256단계의 색으로 만들었다. 이 경우 실제 적용시켰을 때 녹색 영역이 너무 넓어 빨강과 파란색이 조금 많이 안보이는 듯해서 Green-Cyan  , Cyan-Green을 128 단계로 수정한 것이 두번째 Function이다.  그래도 여전이 빨강과 파랑이 어둡진 않아서 빨강의 최대지점과 파란색의 최대지점을 잘 확인이 안되서 각 100 단계씩 추가한 것이 세번째 Function이다.


참고로 Function을 적용하여 메쉬 버텍스의 높이에 따라 색상을 표현한 간단한 사용 예를 함께 작성해보았다.

--------------------------------------------------------------------------------------------------

Function ColorMapRainbow1()
  Dim lngCol(1023),i
  For i=0 To 1023
      If i < 256 Then
          '(255,0,0) to (255,255,0).
          lngCol(1023-i) = RGB(255, i, 0)
      ElseIf i < 512 Then
          '(255,255,0) to (0,255,0).
          lngCol(1023-i) = RGB(255 - (i-256), 255, 0)
      ElseIf i< 768 Then
          '(0,255,0) to (0,255,255).
          lngCol(1023-i) = RGB(0, 255, i-512)
      Else
          '(0,255,255) to (0,0,255).
          lngCol(1023-i) = RGB(0, 255 - (i-768), 255)
      End If
  Next
 
  ColorMapRainbow1 = lngCol  
End Function



--------------------------------------------------------------------------------------------------
Function ColorMapRainbow2()
  Dim lngCol(767),i
  For i=0 To 767
      If i < 256 Then
          '(255,0,0) to (255,255,0).
          lngCol(767-i) = RGB(255, i, 0)
      ElseIf i < 384 Then
          '(255,255,0) to (0,255,0).
          lngCol(767-i) = RGB(255 - (i-256)*2, 255, 0)
      ElseIf i< 512 Then
          '(0,255,0) to (0,255,255).
          lngCol(767-i) = RGB(0, 255, (i-384)*2)
      Else
          '(0,255,255) to (0,0,255).
          lngCol(767-i) = RGB(0, 255 - (i-512), 255)
      End If
  Next
 
  ColorMapRainbow2 = lngCol  
End Function
   
--------------------------------------------------------------------------------------------------
Function ColorMapRainbow3()
  Dim lngCol(967),i
  For i=0 To 967
      If I<100 Then
          '(155,0,0) to (255,0,0)
          lngCol(967-i) = RGB(255-(100-i), 0, 0)
      ElseIf i < 356 Then
          '(255,0,0) to (255,255,0).
          lngCol(967-i) = RGB(255, i-100, 0)
      ElseIf i < 484 Then
          '(255,255,0) to (0,255,0).
          lngCol(967-i) = RGB(255 - (i-356)*2, 255, 0)
      ElseIf i< 612 Then
          '(0,255,0) to (0,255,255).
          lngCol(967-i) = RGB(0, 255, (i-484)*2)
      ElseIf I<868 Then
          '(0,255,255) to (0,0,255).
          lngCol(967-i) = RGB(0, 255 - (i-612), 255)
      Else
          '(0,0,255) to (0,0,155)
          lngCol(967-i) = RGB(0, 0, 255-(i-868))
      End If
  Next
 
  ColorMapRainbow3 = lngCol  
End Function

--------------------------------------------------------------------------------------------------

사용예 : 메쉬 버텍스의 Z값에 따라 색상을 표현

main
Sub main()

Dim ColMap, strObject, arrVertices, Vcount, i,j

ColMap = ColorMapRainbow3

strObject = Rhino.GetObject("Select mesh")
arrVertices = Rhino.MeshVertices(strObject)

Vcount=UBound(arrVertices)

ReDim arrColors(Vcount), arrColorIndex(Vcount)
ReDim Z(Vcount)

For i=0 To Vcount
  Z(i)=arrVertices(i)(2)
  arrColorIndex(i)=i
Next


SortByKey Z, arrColorIndex


For i=0 To Vcount
  j=Int(i/Vcount *UBound(ColMap))
  arrColors(arrColorindex(i)) = ColMap(j)
Next

Rhino.MeshVertexColors strObject, arrColors

 
 
End Sub
   
  

Sub QuickSort(ByRef A(), ByRef B(), ByVal min, ByVal max)
    Dim i : i = min: Dim k : k = max
    If (max - min) >= 1 Then
        Dim pivot : pivot = A(min)
        While (k > i)
            While (A(i) <= pivot And i <= max And k > i)
                i = i+1
            Wend
            While (A(k) > pivot And k >= min And k >= i)
                k = k-1        
            Wend       
            If (k > i) Then Call SwapElements(A, B, i, k)                  
        Wend
        Call SwapElements(A, B, min, k)
        Call QuickSort(A, B, min, k-1)
        Call QuickSort(A, B, k+1, max)
    End If
End Sub
Sub SwapElements(ByRef A(), ByRef B(), ByVal i0, ByVal i1)
    Dim loc_A : loc_A = A(i0)
    Dim loc_B : loc_B = B(i0)
    A(i0) = A(i1)
    B(i0) = B(i1)
    A(i1) = loc_A
    B(i1) = loc_B
End Sub

Function SortByKey(ByRef Keys(), ByRef Values())
    Call QuickSort(Keys, Values, 0, UBound(Keys))
End Function

No comments: