00000000.htm
来自「水木清华BBS」· HTM 代码 · 共 510 行 · 第 1/2 页
HTM
510 行
case StreamTokenizer.TT_NUMBER:
<BR> if (coordnum < 3) {
<BR> vert[num*3 + coordnum] = (float)stream.nval;
<BR> coordnum++;
<BR> }
<BR>
<BR> }
<BR>
<BR> }
<BR>
<BR> num = 0; coordnum = 0;
<BR> boolean gotnum = false;
<BR>
<BR> scanfaces: // read the faces
<BR>
<BR> while (num < nfaces) {
<BR>
<BR> switch (stream.nextToken()) {
<BR>
<BR> default:
<BR> break;
<BR>
<BR> case StreamTokenizer.TT_EOL:
<BR> if (gotnum) { num++; }
<BR> gotnum = false;
<BR> break;
<BR>
<BR> case StreamTokenizer.TT_NUMBER:
<BR> if (!gotnum) {
<BR>
<BR> face[num] = new Face();
<BR> face[num].numVerts((int)stream.nval);
<BR> gotnum = true; coordnum = 0;
<BR>
<BR> } else if (coordnum < face[num].nverts) {
<BR>
<BR> face[num].index[coordnum] = 3 * (int)stream.nval;
<BR> coordnum++;
<BR>
<BR> } else {
<BR>
<BR> face[num].cr = 255; face[num].cg = 255; face[num].cb = 255;
<BR> float val = (float)stream.nval;
<BR>
<BR> if (val <= 1) { val *= 255; }
<BR>
<BR> face[num].cr = (int)val;
<BR>
<BR> if (stream.nextToken() != StreamTokenizer.TT_EOL) {
<BR>
<BR> val = (float)stream.nval;
<BR> if (val <= 1) { val *= 255; }
<BR> face[num].cg = (int)val;
<BR>
<BR> if (stream.nextToken() != StreamTokenizer.TT_EOL) {
<BR>
<BR> val = (float)stream.nval;
<BR> if (val <= 1) { val *= 255; }
<BR> face[num].cb = (int)val;
<BR>
<BR> } else {
<BR>
<BR> face[num].cr = 255; face[num].cg = 255; face[num].cb = 255;
<BR> num++; gotnum = false;
<BR>
<BR> }
<BR>
<BR> } else {
<BR>
<BR> face[num].cr = 255; face[num].cg = 255; face[num].cb = 255;
<BR> num++; gotnum = false;
<BR>
<BR> }
<BR> }
<BR>
<BR> break;
<BR>
<BR> }
<BR>
<BR> }
<BR>
<BR>
<BR> }
<BR>
<BR>
<BR>/* transform all points in model */
<BR>
<BR> void transform() {
<BR>
<BR> if (transformed || nverts <= 0)
<BR> return;
<BR>
<BR> if (tvert == null)
<BR> tvert = new int[nverts*3];
<BR>
<BR> mat.transform(vert, tvert, nverts);
<BR> transformed = true;
<BR> }
<BR>
<BR>
<BR>/**
<BR> * The quick sort algorithm in this method is used for sorting faces
<BR> * from back to front by z depth values.
<BR> */
<BR>
<BR> void qs(int left, int right) {
<BR>
<BR> int i, j, x, y;
<BR>
<BR> i = left; j = right;
<BR> x = face[findex[(left+right)/2]].zdepth;
<BR>
<BR> do {
<BR>
<BR> while (face[findex[i]].zdepth > x && i < right) i++;
<BR> while (x > face[findex[j]].zdepth && j > left) j--;
<BR>
<BR> if (i <= j) {
<BR> y = findex[i];
<BR> findex[i] = findex[j];
<BR> findex[j] = y;
<BR> i++; j--;
<BR> }
<BR>
<BR> } while (i <= j);
<BR>
<BR> if (left < j) qs(left, j);
<BR> if (i < right) qs(i, right);
<BR>
<BR> }
<BR>
<BR>
<BR>/* Paint myself to the graphics context. */
<BR>
<BR> void paint(Graphics g) {
<BR>
<BR> if (vert == null || nverts <= 0)
<BR> return;
<BR>
<BR> transform();
<BR>
<BR> if (gr == null) { // allocate colors if
<BR> // they haven't been
<BR> gr = new Color[nfaces]; // allocated already
<BR>
<BR> for (int i = 0; i < nfaces; i++) {
<BR>
<BR> gr[i] = new Color(face[i].cr, face[i].cg, face[i].cb);
<BR>
<BR> }
<BR>
<BR> }
<BR>
<BR>/**
<BR> * Calculate the average z depth of faces and use this to sort them.
<BR> * This is called the "Painter's algorithm" and although it works in
<BR> * some case, does *not* always provide a correct ordering. Sometimes
<BR> * a correct ordering is impossible, especially in the case of mutually
<BR> * overlapping polygons.
<BR> */
<BR>
<BR> for (int i = 0; i < nfaces; i++) {
<BR>
<BR> face[i].zdepth = 0;
<BR>
<BR> for (int c = 0; c < face[i].nverts; c++) {
<BR>
<BR> if (face[i].zdepth < tvert[face[i].index[c]+2])
<BR> face[i].zdepth = tvert[face[i].index[c]+2];
<BR> }
<BR>
<BR> }
<BR>
<BR> qs(0, nfaces-1); // quick sort the faces
<BR>
<BR> for (int f = 0; f < nfaces; f++) {
<BR>
<BR> int i = findex[f];
<BR> int v = 0;
<BR>
<BR> for (int c = 0; c < face[i].nverts; c++) {
<BR> vx[c] = tvert[face[i].index[c]];
<BR> vy[c] = tvert[face[i].index[c]+1];
<BR> }
<BR>
<BR> g.setColor(gr[i]);
<BR> g.fillPolygon(vx, vy, face[i].nverts); // draw each face
<BR>
<BR> g.setColor(Color.black);
<BR>
<BR> for (v = 0; v < (face[i].nverts-1); v++) {
<BR> g.drawLine(vx[v], vy[v], vx[v+1], vy[v+1]); // draw the face edges
<BR> }
<BR>
<BR> g.drawLine(vx[v], vy[v], vx[0], vy[0]);
<BR>
<BR> }
<BR>
<BR> }
<BR>
<BR>/* calculate the bounding box of our object: */
<BR>
<BR> void findBB() {
<BR> if (nverts <= 0)
<BR> return;
<BR>
<BR> float v[] = vert;
<BR> float xmin = v[0], xmax = xmin;
<BR> float ymin = v[1], ymax = ymin;
<BR> float zmin = v[2], zmax = zmin;
<BR>
<BR> for (int i = nverts * 3; (i -= 3) > 0;) {
<BR>
<BR> float x = v[i];
<BR> if (x < xmin)
<BR> xmin = x;
<BR> if (x > xmax)
<BR> xmax = x;
<BR> float y = v[i + 1];
<BR> if (y < ymin)
<BR> ymin = y;
<BR> if (y > ymax)
<BR> ymax = y;
<BR> float z = v[i + 2];
<BR> if (z < zmin)
<BR> zmin = z;
<BR> if (z > zmax)
<BR> zmax = z;
<BR>
<BR> }
<BR>
<BR> this.xmax = xmax;
<BR> this.xmin = xmin;
<BR> this.ymax = ymax;
<BR> this.ymin = ymin;
<BR> this.zmax = zmax;
<BR> this.zmin = zmin;
<BR>
<BR> }
<BR>
<BR>}
<BR>
<BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 162.105.18.102] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?