성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - PLplot 색상 제어</h1> <p> 저도 확실히는 모르지만, 일단 그냥 코드 상으로 본 것만 기록을 남기려고 합니다.<br /> <br /> 우선, PLplot은 palette 개념이 있는 듯한데 기본적으로 16개 공간만 있고 다음의 코드를 통해 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using (var pl = new PLStream()) { for (int i = 0; i < 20; i ++) { <span style='color: blue; font-weight: bold'>pl.gcol0(i, out int r, out int g, out int b);</span> Console.WriteLine($"{i} == {r}, {g}, {b}"); } } /* 0 == 0, 0, 0 1 == 255, 0, 0 2 == 255, 255, 0 3 == 0, 255, 0 4 == 127, 255, 212 5 == 255, 192, 203 6 == 245, 222, 179 7 == 190, 190, 190 8 == 165, 42, 42 9 == 0, 0, 255 10 == 138, 43, 226 11 == 0, 255, 255 12 == 64, 224, 208 13 == 255, 0, 255 14 == 250, 128, 114 15 == 255, 255, 255 16 == 0, 0, 0 ... 17번 부터는 다음과 같은 식으로 오류 발생 *** PLPLOT ERROR, ABORTING OPERATION *** plgcol0: Invalid color index: 17, aborting operation 17 == -1, -1, -1 */ </pre> <br /> 위의 컬러 값에 대한 상수 값은 다음과 같이 미리 정의되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > namespace PLplot { public static class Color { public const int Black = 0; public const int Red = 1; public const int Yellow = 2; public const int Green = 3; public const int Aquamarine = 4; public const int Pink = 5; public const int Wheat = 6; public const int Grey = 7; public const int Brown = 8; public const int Blue = 9; public const int BlueViolet = 10; public const int Cyan = 11; public const int Turquoise = 12; public const int Magenta = 13; public const int Salmon = 14; public const int White = 15; } } </pre> <br /> 당연히 palette 값은 수정될 수 있고, 이것을 미리 정의한 테마 파일들이 바이너리가 놓인 폴더 하위 "plplot"에 담겨 있습니다. (nuget인 경우, "%USERPROFILE%\.nuget\packages\plplot\5.13.7\runtimes\win-x64\native\plplot" 폴더)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > cmap0_alternate.pal cmap0_black_on_white.pal cmap0_default.pal cmap0_white_bg.pal cmap1_blue_red.pal cmap1_blue_yellow.pal cmap1_default.pal cmap1_gray.pal cmap1_highfreq.pal cmap1_lowfreq.pal cmap1_radar.pal </pre> <br /> 각각의 pal 파일은 텍스트 파일로 16개의 palette 색상 값을 재정의한 RGB 값을 포함합니다. 예를 들어 "cmap0_alternate.pal" 파일은 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 16 #ffffff #000000 #0000ff #ff0000 #a52a2a #fa8072 #ffc0cb #7fffd4 #f5deb3 #40e0d0 #bebebe #00ffff #00ff00 #ffff00 #ff00ff #8a2be2 </pre> <br /> 그러니까 가령 pl.col0 값으로 Black 인덱스를 설정한 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.col0(PLplot.Color.Black); // 검정색 지정 </pre> <br /> 기본 palette 설정에서는 검은색으로 나오겠지만, cmap0_alternate.pal 테마를 설정한 경우에는 동일한 코드가,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.spal0("cmap0_alternate.pal"); pl.col0(PLplot.Color.Black); </pre> <br /> "#ffffff" 하얀색으로 바뀌게 되는 것입니다. 참고로, 기본 palette도 "cmap0_default.pal"이름으로 저장되어 있으며 다음과 같이 빈 문자열을 주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.spal0(""); // cmap0_default.pal 선택 </pre> <br /> 기본 palette이 선택됩니다. (null을 주면 System.AccessViolationException 예외가 발생합니다)<br /> <br /> <hr style='width: 50%' /><br /> <br /> palette은 코드 중간에 바뀌는 것이 허용됩니다. 예를 들어, 기본 상태에서는 다음과 같이 검은 바탕에 빨간색 축이지만,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='plplot_color_1.png' src='/SysWebRes/bbs/plplot_color_1.png' /><br /> <br /> pl.init() 호출 전에 palette을 바꿔주면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.spal0("cmap0_alternate.pal"); pl.init(); </pre> <br /> (테마에 재정의되었으므로) 하얀색 바탕에 검은색 축이 그려지고, 이후 다시 spal0 호출로 바꿔주면 그에 따른 색상 인덱스를 지정할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <span style='color: blue; font-weight: bold'>pl.spal0("cmap0_alternate.pal"); pl.init(); </span> pl.env(xMin, xMax, yMin, yMax, AxesScale.Independent, AxisBox.BoxTicksLabelsAxes); pl.lab("X", "Y", "Click"); char code = Symbol.Bullet; <span style='color: blue; font-weight: bold'>pl.spal0("");</span> // 기본 palette으로 복구했으므로, <span style='color: blue; font-weight: bold'>pl.col0(PLplot.Color.Blue);</span> // Blue 인덱스의 의미에 따라 파란색 점으로 출력 pl.poin(xData, yData, code); </pre> <br /> <img onclick='toggle_img(this)' class='imgView' alt='plplot_color_2.png' src='/SysWebRes/bbs/plplot_color_2.png' /><br /> <br /> 개인적인 생각으로는, PLplot.Color 상수를 사용하는 경우에는 palette을 기본 설정한 상태로 써야 혼란이 없을 것이고 만약 palette을 바꾼 상태에서 쓰고 싶다면 바뀐 테마에 맞게 상수를 새롭게 정의해서 쓰는 것이 좋을 듯합니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8171
(왼쪽의 숫자를 입력해야 합니다.)