testview.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  */
  34. #include <stdlib.h>
  35. #ifdef WIN32
  36. #include <windows.h>
  37. #endif
  38. #include <ctype.h>
  39. #include <math.h>
  40. #include "bbox.h"
  41. #include "netview.h"
  42. #include "netmodel.h"
  43. #include "tclcl.h"
  44. #include "paint.h"
  45. #include "packet.h"
  46. #include "testview.h"
  47. void
  48. TestView::getWorldBox(BBox& world_boundary) {
  49.   model_->BoundingBox(world_boundary);
  50. }
  51. void TestView::resize(int width, int height)
  52. {
  53. width_ = width;
  54. height_ = height;
  55. matrix_.clear();
  56. BBox bb;
  57. bb.xmin=0;
  58. bb.ymin=0;
  59. bb.xmax=width;
  60. bb.ymax=height;
  61. BoundingBox(bb);
  62. double x = (0.0-panx_)*width;
  63. double y = (0.0-pany_)*height;
  64. double w = width;
  65. double h = height;
  66. double nw = bb.xmax - bb.xmin;
  67. double nh = bb.ymax - bb.ymin;
  68. double bbw;
  69. double bbh;
  70. if (aspect_==SQUARE) {
  71.   bbw = 1.1 * nw;
  72.   bbh = 1.1 * nh;
  73. } else {
  74.   bbw = nw;
  75.   bbh = nh;
  76. }
  77. matrix_.translate(-bb.xmin, -bb.ymin);
  78. double ws = w / bbw;
  79. double hs = h / bbh;
  80. if (aspect_==SQUARE) {
  81.   if (ws <= hs) {
  82.     matrix_.scale(ws, ws);
  83.     scale_=ws;
  84.     matrix_.translate(x, y + 0.5 * (h - ws * bbh));
  85.   } else {
  86.     matrix_.scale(hs, hs);
  87.     scale_=hs;
  88.     matrix_.translate(x + 0.5 * (w - hs * bbw), y);
  89.   }
  90. } else {
  91.   matrix_.scale(ws, hs);
  92.   matrix_.translate(x, y);
  93. }
  94.   if ((width_<=0)||(height_<=0)) abort();
  95. matrix_.scale(magnification_, magnification_);
  96. }
  97. int count = 0;
  98. void TestView::draw()
  99. {
  100.   int xmin, ymin, xmax, ymax;
  101.   BBox bb;
  102.   BoundingBox(bb);
  103.   matrix_.map(bb.xmin, bb.ymin, xmin, ymin);
  104.   matrix_.map(bb.xmax, bb.ymax, xmax, ymax);
  105.   
  106.   xmin+=36;
  107.   ymin+=36;
  108.   xmax+=36;
  109.   ymax+=36;
  110.   file_ = fopen(name_, "a");
  111. fprintf(file_, "n--- snapshot (%d) ---n", count);
  112.   count++;
  113.   
  114.   model_->render(this);
  115.   fclose(file_);
  116. }
  117. TestView::TestView(const char* name, NetModel* m)
  118.     : View(name, SQUARE,200,200), model_(m), scale_(1.0)
  119. {
  120.   name_=new char[strlen(name)+1];
  121.   strcpy(name_, name);
  122.   resize(540,720);
  123.   draw();
  124. }
  125. void 
  126. TestView::line(float x0, float y0, float x1, float y1, int paint)
  127. {
  128. float ax, ay, bx, by;
  129. rgb * color;
  130. matrix_.map(x0, y0, ax, ay);
  131. matrix_.map(x1, y1, bx, by);
  132. color = Paint::instance()->paint_to_rgb(paint);
  133. fprintf(file_, "half line ");
  134. fprintf(file_, "from <%.1f %.1f> to <%.1f %.1f>n",
  135.           ax, ay, bx, by);
  136. }
  137. void TestView::rect(float x0, float y0, float x1, float y1, int paint)
  138. {
  139. float x, y;
  140. matrix_.map(x0, y0, x, y);
  141. float xx, yy;
  142. matrix_.map(x1, y1, xx, yy);
  143. float w = xx - x;
  144. if (w < 0) {
  145. x = xx;
  146. w = -w;
  147. }
  148. float h = yy - y;
  149. if (h < 0) {
  150. h = -h;
  151. y = yy;
  152. }
  153.   if (y>0) {
  154.     fprintf(file_, "agent ");
  155.     fprintf(file_, "at <x=%.1f y=%.1f> with <width=%.1f height=%.1f>n", x, y, w, h);
  156.   }
  157. }
  158. typedef struct floatpoint_s {
  159.   float x, y;
  160. } floatpoint;
  161. void TestView::polygon(const float* x, const float* y, int n, int paint)
  162. {
  163. floatpoint pts[10];
  164. int i;
  165.   
  166. for (i = 0; i < n; ++i) {
  167. matrix_.map(x[i], y[i], pts[i].x, pts[i].y);
  168. }
  169. pts[n] = pts[0];
  170.   
  171. fprintf(file_,"polygon node ");
  172. fprintf(file_,"at <%.1f %.1f>n", pts[0].x, pts[0].y);
  173. }
  174. void TestView::fill(const float* x, const float* y, int n, int paint)
  175. {
  176. floatpoint pts[10];
  177. int i;
  178.   
  179. for (i = 0; i < n; ++i) {
  180. matrix_.map(x[i], y[i], pts[i].x, pts[i].y);
  181. }
  182. pts[n] = pts[0];
  183.   
  184. fprintf(file_,"packet ");
  185. fprintf(file_, "at <%.1f %.1f>n", pts[0].x, pts[0].y);
  186. }
  187. void TestView::circle(float x, float y, float r, int paint)
  188. {
  189. float tx, ty;
  190. matrix_.map(x, y, tx, ty);
  191. float tr, dummy;
  192. matrix_.map(x + r, y, tr, dummy);
  193. tr -= tx;
  194.   
  195. fprintf(file_, "circle node ");
  196. fprintf(file_, "at <%.1f %.1f> with <radius %.1f>n", tx, ty, tr);
  197. }
  198. void TestView::string(float fx, float fy, float dim, const char* s, int anchor, 
  199.                       const char*)
  200. {
  201.   float x, y;
  202.   int d;
  203.   matrix_.map(fx, fy, x, y);
  204.   
  205.   float dummy, dlow, dhigh;
  206.   matrix_.map(0., 0., dummy, dlow);
  207.   matrix_.map(0., 0.6 * dim, dummy, dhigh);
  208.   d = int(dhigh - dlow);
  209.   
  210.   if(s!="") {
  211.     switch (anchor) {
  212.       case ANCHOR_CENTER:
  213.         fprintf(file_, "with label (%s) at center <%.1f %.1f>n", s, x, y);
  214.         break;
  215.       case ANCHOR_NORTH:
  216.         fprintf(file_, "with label (%s) at north <%.1f %.1f>n", s, x, y);
  217.         break;
  218.       case ANCHOR_SOUTH:
  219.         fprintf(file_, "with label (%s) at south <%.1f %.1f>n", s, x, y);
  220.         break;
  221.       case ANCHOR_WEST:
  222.         fprintf(file_, "with label (%s) at west <%.1f %.1f>n", s, x, y);
  223.         break;
  224.       case ANCHOR_EAST:
  225.         fprintf(file_, "with label (%s) at east <%.1f %.1f>n", s, x, y);
  226.         break;
  227.     }
  228.   }
  229. }