#define MULTI_PLOT true //Determine whether or not to plot multiple iterations.

#define X_MAX 1.0   // Define extent of reference plane, used in call to gluOrtho2D(...)
#define Y_MAX 1.0
#define X_MIN -1.0
#define Y_MIN -1.0
#define N_X 640 // Number of cells in x and y dimensions
#define N_Y 480
#define OX (-1 + i * dx)
#define OY (1 - j * dy) #include <stdio.h>
#include <GL/glut.h>
#include <iostream>> double h = 0.0; // Height of reference plane in which contour is to be plotted -- f(x,y)=h
double dx = 2 / (double)(N_X - 1);
double dy = 2 / (double)(N_Y - 1); double data[N_X][N_Y]; // Array to hold function values (a,b,c,d) at corners of each cell
double f(double x, double y); // Function whose contour is to be plotted
int cell(double a, double b, double c, double d); // Helper ftn to determine cell type from f corner values
void lines(int, int, int, double, double, double, double); // Helper ftn to draw correct line in a cell
void display(); void multidisplay(){
glClear(GL_COLOR_BUFFER_BIT); h = 0;
for (; h < 1; h += .01){
display();
}
}
void display() // Display callback function - called when window appears; drawing done here
{
if (!MULTI_PLOT) glClear(GL_COLOR_BUFFER_BIT); // form data array from function
for (int i = 0; i < N_X; i++)
for (int j = 0; j < N_Y; j++)
data[i][j] = f(OX, OY); // double loop to process each cell (loop through each cell i,j; determine cell type, draw line in cell)
int k = 0;
for (int i = 0; i < N_X - 1; i++){
for (int j = 0; j < N_Y - 1; j++){
int c = cell(data[i][j], data[i + 1][j], data[i][j + 1], data[i + 1][j + 1]); // return cell type c (0-15)
lines(c, i, j, data[i][j], data[i + 1][j], data[i][j + 1], data[i + 1][j + 1]); // draw correct line
k++;
}
} glFlush();
} double f(double x, double y) // Function to be plotted, example: Ovals of Cassini
{
double a = 0.48, b = 0.5;
return (x*x + y*y + a*a)*(x*x + y*y + a*a) - 4 * a*a*x*x - b*b*b*b;
} void init()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(X_MIN, X_MAX, Y_MIN, Y_MAX);
glMatrixMode(GL_MODELVIEW);
} int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowPosition(50, 50);
glutInitWindowSize(500, 500);
glutCreateWindow("Oval of Cassini Contour plot");
init();
glutDisplayFunc(MULTI_PLOT ? multidisplay : display); // White drawing color
glClearColor(0.0, 0.0, 0.0, 1.0); // Black background
glColor3f(1.0, 1.0, 1.0);
glutMainLoop();
} int cell(double a, double b, double c, double d) // Determine and return cell type
{
int n = 0;
if (a > h) n += 1;
if (b > h) n += 8;
if (c > h) n += 4;
if (d > h) n += 2;
return n;
} void draw_one(int n, int i, int j, double a, double b, double c, double d){
double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
switch (n){
case 1:
case 14: x1 = OX;
y1 = OY - (dy * ((h - a) / (c - a)));
x2 = OX + (dx * ((h - a) / (b - a)));
y2 = OY;
//printf("1: (%f, %f)\n", (h - a) / (d - a), (h - a) / (b - a));
break;
case 4:
case 11: x1 = OX;
y1 = OY - (dy * ((h - a) / (c - a)));
x2 = OX + (dx * ((h - c) / (d - c)));
y2 = OY - dy;
//printf("2: (%f, %f)\n", (h - c)/(b - c), (h - c)/(a - c));
break;
case 2:
case 13: x1 = OX + dx;
y1 = OY - (dy * ((h - b) / (d - b)));
x2 = OX + (dx * ((h - c) / (d - c)));
y2 = OY - dy;
// printf("3: (%f, %f)\n", (h - d) / (a - d), (h - d) / (c - d));
break;
case 7:
case 8: x1 = OX + dx;
y1 = OY - (dy * ((h - b) / (d - b)));
x2 = OX + (dx * ((h - a) / (b - a)));
y2 = OY;
// printf("4: (%f, %f)\n", (h - b) / (c - b), (h - b) / (d - b));
break;
}
glBegin(GL_LINES);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glEnd();
} void draw_opposite(int n, int i, int j, double a, double b, double c, double d){
double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
switch (n){
case 5:
case 10: y1 = OY;
x1 = OX + (dx * ((h - a) / (b - a)));
y2 = OY - dy;
x2 = OX + (dx * ((h - c) / (d - c)));
break;
case 6:
case 9: x2 = OX;
y1 = OY - (dy * ((h - b) / (d - b)));
x1 = OX + dx;
y2 = OY - (dy * ((h - a) / (c - a)));
break;
}
glBegin(GL_LINES);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glEnd(); } void lines(int n, int i, int j, double a, double b, double c, double d) // Draw correct line
{
// Your code goes here
// n is cell type (0-15)
// i,j specifes which cell
// a,b,c,d are function values at cell corners (from data array)
switch (n){
case 1:
case 2:
case 4:
case 7:
case 8:
case 11:
case 13:
case 14:
draw_one(n, i, j, a, b, c, d);
break;
case 5:
case 6:
case 9:
case 10: draw_opposite(n, i, j, a, b, c, d);
break;
case 0:
case 15: break;
default:
//exit(2);
break;
}
}

ContourLine的更多相关文章

  1. ArcGIS Runtime for Android 使用异步GP服务绘制等值线

    关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...

  2. (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线

    关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...

随机推荐

  1. 企业架构研究总结(43)——企业架构与建模之ArchiMate详述(下)

    2.7 关系模型元素 企业架构模型包括了各种概念元素以及他们之间的关系,这其中的概念元素已经在前面几节中进行了阐述,而这些概念元素之间的关系则是本节的叙述重点.虽然ArchiMate中具有种类繁多的概 ...

  2. 记一次有趣的互联网事件及console.log~

    寂寞的中国互联网又一次瘫痪了. 说是顶级域的根挂了,不知道是黑客还是某个实习生干挂的. 反正到现在还没有人来解释这件事. 先普及一下,为什么顶级域的根挂了全中国都挂了. 那是因为dns解析的特点是递归 ...

  3. Jquery轻量级幻灯插件-OWL Carousel--支持触屏的移动浏览器

    Jquery轻量级幻灯插件-OWL Carousel--支持触屏的移动浏览器 在项目中,需要做一个幻灯功能,领导说需要一个小清醒的啊,轻量级的.刚开始搜索到这个: CRAFTYSLIDE插件.但是用起 ...

  4. JavaScript 面向对象编程(三)如何写类和子类

    在JavaScript面向对象编程(一)原型与继承和JavaScript面向对象编程(二)构造函数和类中,我们分别讨论了JavaScript中面向对象的原型和类的概念.基于这两点理论,本篇文章用一个简 ...

  5. zTree应用实例详讲

    zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...

  6. boost 1.49在vs 2005下编译的方法

    首先下载boost库,网上自己搜索. 然后解压到一个目录:如D:\boost_1_49_0.然打开vs2005的命令提示符,进行D:\boost_1_49_0目录: 1.运行bootstrap.bat ...

  7. Java线程同步之一--AQS

    Java线程同步之一--AQS 线程同步是指两个并发执行的线程在同一时间不同时执行某一部分的程序.同步问题在生活中也很常见,就比如在麦当劳点餐,假设只有一个服务员能够提供点餐服务.每个服务员在同一时刻 ...

  8. centos6.5 搭建nginx1.6.0 +gridfs +mongodb2.4..10环境

    一) 缘由 因为公司业务需要,需要搭建图片服务器,需求很简单:读取+上传图片,当时第一考虑用nginx来作,但考虑到单纯用nginx来作,无法水平扩展和管理,一旦遇到海量图片,就无办法 扩展.所以考虑 ...

  9. QT 初试 MainWindow简易窗体

    1.创建一个空的QT工程文件 2 建立程序文件 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QMainWind ...

  10. 用ajax对数据进行查看人员信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...