성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
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의 16색 이상을 표현하는 방법과 subpage를 이용한 그리드 맵 표현</h1> <p> 지난 글에서는 PLplot으로 Histogram 그리기와,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - MathNet으로 정규 분포를 따르는 데이터를 생성, PLplot으로 Histogram 표현 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11946'>http://www.sysnet.pe.kr/2/0/11946</a> </pre> <br /> 색상 표현이 기본 16개의 palette로 관리된다고 했습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - PLplot 색상 제어 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11920'>http://www.sysnet.pe.kr/2/0/11920</a> </pre> <br /> 이 때문에, 만약 0 ~ 15 범위를 벗어나는 인덱스를 컬러 값 사용으로 바꾸면 오류가 발생합니다.<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(16); /* 오류 발생 *** PLPLOT ERROR, ABORTING OPERATION *** plcol0: Invalid color map entry: 16, aborting operation */ </pre> <br /> 물론 16색을 초과하는 색상을 표현하는 방법이 있고, 이에 대해서는 PLplot 2번 예제에서 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PLplot - Example 02 ; <a target='tab' href='http://plplot.org/examples.php?demo=02'>http://plplot.org/examples.php?demo=02</a> </pre> <br /> 예를 들어, 100개의 추가 색상을 palette에 구성한다고 했을 때 R, G, B 색상 값을 담을 배열을 100 + 16만큼 마련합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > int[] r = new int[116]; int[] g = new int[116]; int[] b = new int[116]; </pre> <br /> 그다음, 최하위의 기본 색상 16개는 theme 컬러의 원래 값으로 채워주고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > for (i = 0; i <= 15; i ++) { pl.gcol0(i, out r[i], out g[i], out b[i]); } </pre> <br /> 나머지 영역에 100개의 원하는 색상을 추가하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > for (i = 0; i <= 99; i++) { r[i + 16] = ...; g[i + 16] = ...; b[i + 16] = ...; } </pre> <br /> 마지막으로, 이렇게 새롭게 구성한 palette을 color map에 설정합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.scmap0(r, g, b); pl.col0(16); // 오류 없이 정상적으로 17번째 색상을 사용 </pre> <br /> <hr style='width: 50%' /><br /> <br /> 색상은 해결되었으니, 이제 PLplot을 이용해 grid map처럼,<br /> <br /> <img alt='plplot_grid_map_1.png' src='/SysWebRes/bbs/plplot_grid_map_1.png' /><br /> <br /> 표현하는 방법을 보겠습니다. 이것 역시, 색상과 동일한 예제에서 그 방법을 찾을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PLplot - Example 02 ; <a target='tab' href='http://plplot.org/examples.php?demo=02'>http://plplot.org/examples.php?demo=02</a> </pre> <br /> 그런데, 개념이 재미있습니다. ^^ 우선, 하나의 그림을 그리는 Canvas를 Page로 다루는데, 이 Page를 다시 여러 개의 Subpage로 나눌 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private static void demo1(PLStream pl) { pl.bop(); int nx = 4; int ny = 4; { <span style='color: blue; font-weight: bold'>pl.ssub(nx, ny)</span>; // 하나의 화면을 4x4 canvas로 분할 } pl.eop(); } </pre> <br /> 일단 subpage로 나눈 시점부터는 drawing 명령어들이 아무런 페이지도 선택되지 않은 상태이므로 pl.adv 명령어를 한번 호출해 subpage를 선택하는 걸로 시작해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > pl.adv(0); // next sub page를 선택, 최초 호출이면 (0,0) sub page 선택 </pre> <br /> 그다음, 해당 subpage의 viewport와 window 영역을 설정하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double vmin = 0.0, vmax = 1.0; pl.vpor(vmin, vmax, vmin, vmax); pl.wind(vmin, vmax, vmin, vmax); </pre> <br /> 설정된 영역의 최소/최대 값을 기준으로 drawing 명령어를 사용하면 됩니다. 아래는 이것을 모두 통합한 소스 코드입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private static void demo1(PLStream pl) { pl.bop(); int nx = 4; int ny = 4; { <span style='color: blue; font-weight: bold'>pl.ssub(nx, ny);</span> draw_gridmap(pl, nx * ny, 0); } pl.eop(); } private static void draw_gridmap(PLStream pl, int nw) { double vmin = 0.0, vmax = 1.0; for (int i = 0; i < nw; i ++) { pl.col0(i); <span style='color: blue; font-weight: bold'>pl.adv(0); pl.vpor(vmin, vmax, vmin, vmax); pl.wind(vmin, vmax, vmin, vmax);</span> plfbox(pl); } } private static void plfbox(PLStream pl) { double[] x = { 0, 0, 1.0, 1.0 }; double[] y = { 0, 1.0, 1.0, 0 }; pl.fill(x, y); } </pre> <br /> 위의 소스 코드는 기본 컬러 16 색상만 사용했지만, 만약 100개 색상으로 늘려 표현하고 싶다면 다음과 같은 식으로 소스 코드를 만들면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private static void demo2(PLStream pl) { pl.bop(); <span style='color: blue; font-weight: bold'>pl.ssub(10, 10);</span> <span style='color: blue; font-weight: bold'>fillColor(pl, out int[] r, out int[] g, out int[] b); pl.scmap0(r, g, b);</span> draw_gridmap(pl, 100, 16); pl.eop(); } static void fillColor(PLStream pl, out int [] r, out int [] g, out int [] b) { r = new int[116]; g = new int[116]; b = new int[116]; double lmin = 0.15, lmax = 0.85; for (int i = 0; i <= 15; i++) { pl.gcol0(i, out r[i], out g[i], out b[i]); } for (int i = 0; i <= 99; i++) { double h, l, s; double r1, g1, b1; h = (360.0 / 10.0) * (i % 10); l = lmin + (lmax - lmin) * (i / 10) / 9.0; s = 1.0; pl.hlsrgb(h, l, s, out r1, out g1, out b1); r[i + 16] = (int)(r1 * 255.001); g[i + 16] = (int)(g1 * 255.001); b[i + 16] = (int)(b1 * 255.001); } } private static void draw_gridmap(PLStream pl, int nw, int cmap0_offset) { double vmin = 0.0, vmax = 1.0; for (int i = 0; i < nw; i ++) { <span style='color: blue; font-weight: bold'>pl.col0(i + cmap0_offset);</span> pl.adv(0); pl.vpor(vmin, vmax, vmin, vmax); pl.wind(vmin, vmax, vmin, vmax); plfbox(pl); } } </pre> <br /> <img alt='plplot_grid_map_2.png' src='/SysWebRes/bbs/plplot_grid_map_2.png' /><br /> <br /> (<a target='tab' href='https://github.com/stjeong/DotNetSamples/tree/master/NetCore/PLplotGridmap'>이 글의 예제 코드는 github - PLplotGridmap</a>에서 제공합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1819
(왼쪽의 숫자를 입력해야 합니다.)