라이노 스크립트로 컬러 그라데이션을 나타내려고 할때 빨강에서 파랑으로 변하는 색을 제대로 표현하지 못해 애먹은 기억이 있다. 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:
Post a Comment