用c++编写的程序调用surfer怎么在sufer中成图

Builder和Surfer接口技术及其在气象绘图中的应用,微机原理与接口技术,接口技术..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Builder和Surfer接口技术及其在气象绘图中的应用
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口最近参加一个项目,需在&native层获取Surface并显示图像,在网上搜了N多资料&总算是找到了相关代码 实现,但是编译连接却是个问题。因为刚学android编程不到一月,而且遇到以前没遇到过的情况。即 要用到android源代码和库(.so)进行编译链接&先把代码贴出来吧首先是jni层代码&&#define&TAG&"DisplayYUV"//#define&BUFSIZE&720*1038*2#define&BUFSIZE&176*144#include&&string.h&#include&&android/log.h&#include&&jni.h&#include&&android/bitmap.h&//#include&&android/surface.h&#include&&gui/Surface.h&#include&&ui/Region.h&#include&&utils/RefBase.h&#include&&cstdio&using&namespace&static&sp&Surface&&native_static&android::Surface::SurfaceInfo&static&android::Region&dirtyRchar&buf[BUFSIZE]&=&{0};char&*&bufYUV&=&NULL;FILE&*fp&=&NULL;jsize&len&=&0;extern&"C"{int&setSurface(JNIEnv&*env,&jobject&jsurface,&jint&version);void&Java_com_example_displayyuv_MainActivity_test(JNIEnv&*env,&jobject&thiz,&jobject&jsurface){&&&&__android_log_print(ANDROID_LOG_INFO,&TAG,&"get&good&cpp&test&surface!");&&&&setSurface(env,&jsurface,&9);&&&&//dirtyRegion.set(android::Rect(0x3fff,&0x3fff));&&&&dirtyRegion.set(android::Rect(0,&0,&176,&144));&&&&status_t&err&=&native_surface-&lock(&info,&&dirtyRegion);&&&&int&&&&&switch(info.format)&&&&{&&&&&&&&case&PIXEL_FORMAT_RGBA_8888:&&&&&&&&case&PIXEL_FORMAT_RGBX_8888:&&&&&&&&case&PIXEL_FORMAT_BGRA_8888:&&&&&&&&&&&&sformat&=&4;&&&&&&&&&&&&break;&&&&&&&&case&PIXEL_FORMAT_RGB_888:&&&&&&&&&&&&sformat&=&3;&&&&&&&&&&&&break;&&&&&&&&case&PIXEL_FORMAT_RGB_565:&&&&&&&&case&PIXEL_FORMAT_RGBA_5551:&&&&&&&&case&PIXEL_FORMAT_RGBA_4444:&&&&&&&&&&&&sformat&=&2;&&&&&&&&&&&&break;&&&&&&&&default:&&&&&&&&&&&&sformat&=&-1;&&&&}&&&&sprintf(buf,&"width&-&%d&--&height&%d--&format&%d---Locked&--&%d",&info.w,&info.h,&sformat,&err);&&&&__android_log_print(ANDROID_LOG_INFO,&TAG,&buf);&&&&memset(buf,&0x77,&BUFSIZE);&&&&memcpy(info.bits,&buf,&BUFSIZE);&&&&//memcpy(info.bits,&bufYUV,&len);&&&&native_surface-&unlockAndPost();}static&android::Surface*&getNativeSurface(JNIEnv*&env,&jobject&jsurface,&jint&version){&&&&jclass&clazz&=&env-&FindClass("android/view/Surface");&&&&jfieldID&field_&&&&if(version&&=8)&&&&{&&&&&&&&field_surface&=&env-&GetFieldID(clazz,&"mSurface",&"I");&&&&}&&&&else&&&&&&&&field_surface&=&env-&GetFieldID(clazz,&ANDROID_VIEW_SURFACE_JNI_ID,&"I");&&&&if&(field_surface&==&NULL)&&&&{&&&&&&&&return&NULL;&&&&}&&&&return&(android::Surface&*)&env-&GetIntField(jsurface,&field_surface);}int&setSurface(JNIEnv&*env,&jobject&jsurface,&jint&version){&&&&native_surface&=&getNativeSurface(env,&jsurface,&version);&&&&if(android::Surface::isValid(native_surface))&&&&{&&&&&&&&__android_log_print(ANDROID_LOG_INFO,&"libjni",&"native_surface&is&valid");&&&&&&&&return&1;&&&&}&&&&else&&&&&&&&__android_log_print(ANDROID_LOG_ERROR,&"libjni",&"native_surface&is&invalid");&&&&return&0;}void&Java_com_example_displayyuv_MainActivity_drawYUV(JNIEnv&*env,&jobject&thiz,&jintArray&yuvData){&&&&len&=&env-&GetArrayLength(yuvData);&&&&jint&*byteBuf&=&env-&GetIntArrayElements(yuvData,&0);&&&&bufYUV&=&(char&*)byteB}}&然后是java层代码&package&com.example.import&java.io.Fimport&java.io.FileInputSimport&android.app.Aimport&android.graphics.Bimport&android.graphics.Cimport&android.graphics.Cimport&android.os.Bimport&android.os.Eimport&android.util.Limport&android.view.Simport&android.view.SurfaceHimport&android.view.SurfaceHolder.Cimport&android.view.SurfaceVpublic&class&MainActivity&extends&Activity&{&&&&private&static&final&String&ACTIVITY_TAG&=&"displayYUV";&&&&final&String&FILE_NAME&=&"/akiyo_qcif.yuv";&&&&final&int&width&=&176;&&&&final&int&height&=&144;&&&&final&int&size&=&(int)&(width&*&height&*&1.5);&&&&byte[]&yuvBuffer&=&new&byte[size];&&&&//&final&Builder&builder&=&new&AlertDialog.Builder(this);&&&&private&SurfaceHolder&&&&&@Override&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&setContentView(R.layout.activity_main);&&&&&&&&//&TextView&tv&=&new&TextView(this);&&&&&&&&//&tv.setText(&stringFromJNI()&);&&&&&&&&//&setContentView(tv);&&&&&&&&//&My&Code&&&&&&&&Log.v(ACTIVITY_TAG,&stringFromJNI());&&&&&&&&SurfaceView&surface&=&(SurfaceView)&findViewById(R.id.show);&&&&&&&&//&初始化SurfaceHolder对象&&&&&&&&holder&=&surface.getHolder();&&&&&&&&holder.addCallback(new&Callback()&{&&&&&&&&&&&&@Override&&&&&&&&&&&&public&void&surfaceChanged(SurfaceHolder&arg0,&int&arg1,&int&arg2,&&&&&&&&&&&&&&&&&&&&int&arg3)&{&&&&&&&&&&&&}&&&&&&&&&&&&@Override&&&&&&&&&&&&public&void&surfaceCreated(SurfaceHolder&holder)&{&&&&&&&&&&&&&&&&setVideoSurface(holder.getSurface());&&&&&&&&&&&&&&&&//test(holder.getSurface());&&&&&&&&&&&&&&&&if&(read(yuvBuffer))&{&&&&&&&&&&&&&&&&&&&&//&设置对话框的图标&&&&&&&&&&&&&&&&&&&&//&builder.setIcon(R.drawable.tools);&&&&&&&&&&&&&&&&&&&&//&设置对话框的标题&&&&&&&&&&&&&&&&&&&&//&builder.setTitle("自定义普通对话框");&&&&&&&&&&&&&&&&&&&&//&//&设置对话框显示的内容&&&&&&&&&&&&&&&&&&&&//&builder.setMessage("一个简单的提示对话框");&&&&&&&&&&&&&&&&&&&&//&//创建、并显示对话框&&&&&&&&&&&&&&&&&&&&//&builder.create().show();&&&&&&&&&&&&&&&&&&&&//&}&&&&&&&&&&&&&&&&&&&&//&锁定整个SurfaceView//&&&&&&&&&&&&&&&&&&&&Canvas&canvas&=&holder.lockCanvas();//&&&&&&&&&&&&&&&&&&&&canvas.drawColor(Color.WHITE);//&&&&&&&&&&&&&&&&&&&&//&绘制背景//&&&&&&&&&&&&&&&&&&&&//&Bitmap&back&=&BitmapFactory.decodeResource(//&&&&&&&&&&&&&&&&&&&&//&SurfaceViewTest.this.getResources(),&R.drawable.sun);//&&&&&&&&&&&&&&&&&&&&//&绘制背景//&&&&&&&&&&&&&&&&&&&&//&canvas.drawBitmap(back,&0,&0,&null);//&&&&&&&&&&&&&&&&&&&&//&绘制完成,释放画布,提交修改//&&&&&&&&&&&&&&&&&&&&holder.unlockCanvasAndPost(canvas);//&&&&&&&&&&&&&&&&&&&&yourFunction(yuvBuffer,&width,&height);&&&&&&&&&&&&&&&&&&&&//&//重新锁一次,"持久化"上次所绘制的内容&&&&&&&&&&&&&&&&&&&&//&holder.lockCanvas(new&Rect(0,&0,&0,&0));&&&&&&&&&&&&&&&&&&&&//&holder.unlockCanvasAndPost(canvas);&&&&&&&&&&&&&&&&&&&&int[]&mIntArray&=&new&int[width&*&height];&&&&&&&&&&&&&&&&&&&&//&Decode&Yuv&data&to&integer&array&&&&&&&&&&&&&&&&&&&&//&decodeYUV420SP(mIntArray,&data,&mWidth,&mHeight);&&&&&&&&&&&&&&&&&&&&convertYUV420_NV21toRGB8888(mIntArray,&yuvBuffer,&width,&height);&&&&&&&&&&&&&&&&&&&&drawYUV(mIntArray);&&&&&&&&&&&&&&&&&&&&test(holder.getSurface());&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&&&&&@Override&&&&&&&&&&&&public&void&surfaceDestroyed(SurfaceHolder&holder)&{&&&&&&&&&&&&}&&&&&&&&});&&&&}&&&&private&boolean&read(byte[]&yuvArray)&{&&&&&&&&try&{&&&&&&&&&&&&//&如果手机插入了SD卡,而且应用程序具有访问SD的权限&&&&&&&&&&&&if&(Environment.getExternalStorageState().equals(&&&&&&&&&&&&&&&&&&&&Environment.MEDIA_MOUNTED))&{&&&&&&&&&&&&&&&&//&获取SD卡对应的存储目录&&&&&&&&&&&&&&&&File&sdCardDir&=&Environment.getExternalStorageDirectory();&&&&&&&&&&&&&&&&//&获取指定文件对应的输入流&&&&&&&&&&&&&&&&FileInputStream&fis&=&new&FileInputStream(&&&&&&&&&&&&&&&&&&&&&&&&sdCardDir.getCanonicalPath()&+&FILE_NAME);&&&&&&&&&&&&&&&&fis.read(yuvArray,&0,&size);&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&return&false;&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&catch&(Exception&e)&{&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&&&return&false;&&&&&&&&}&&&&}&&&&void&yourFunction(byte[]&data,&int&mWidth,&int&mHeight)&{&&&&&&&&int[]&mIntArray&=&new&int[mWidth&*&mHeight];&&&&&&&&//&Decode&Yuv&data&to&integer&array&&&&&&&&//&decodeYUV420SP(mIntArray,&data,&mWidth,&mHeight);&&&&&&&&convertYUV420_NV21toRGB8888(mIntArray,&data,&mWidth,&mHeight);&&&&&&&&//&Initialize&the&bitmap,&with&the&replaced&color&&&&&&&&Bitmap&bmp&=&Bitmap.createBitmap(mIntArray,&mWidth,&mHeight,&&&&&&&&&&&&&&&&Bitmap.Config.ARGB_8888);&&&&&&&&Canvas&canvas&=&holder.lockCanvas();&&&&&&&&canvas.drawBitmap(bmp,&0,&0,&null);&&&&&&&&holder.unlockCanvasAndPost(canvas);&&&&&&&&//&Draw&the&bitmap&with&the&replaced&color&&&&&&&&//&iv.setImageBitmap(bmp);&&&&&&&&//&ByteArrayOutputStream&out&=&new&ByteArrayOutputStream();&&&&&&&&//&YuvImage&yuvImage&=&new&YuvImage(data,&ImageFormat.NV21,&width,&&&&&&&&//&height,&null);&&&&&&&&//&pressToJpeg(new&Rect(0,&0,&width,&height),&50,&out);&&&&&&&&//&byte[]&imageBytes&=&out.toByteArray();&&&&&&&&//&Bitmap&bmp&=&BitmapFactory.decodeByteArray(imageBytes,&0,&&&&&&&&//&imageBytes.length);&&&&&&&&//&Canvas&canvas&=&holder.lockCanvas();&&&&&&&&//&canvas.drawBitmap(bmp,&0,&0,&null);&&&&&&&&//&holder.unlockCanvasAndPost(canvas);&&&&}&&&&static&public&void&decodeYUV420SP(int[]&rgba,&byte[]&yuv420sp,&int&width,&&&&&&&&&&&&int&height)&{&&&&&&&&final&int&frameSize&=&width&*&&&&&&&&&for&(int&j&=&0,&yp&=&0;&j&&&&j++)&{&&&&&&&&&&&&int&uvp&=&frameSize&+&(j&&&&1)&*&width,&u&=&0,&v&=&0;&&&&&&&&&&&&for&(int&i&=&0;&i&&&&i++,&yp++)&{&&&&&&&&&&&&&&&&int&y&=&(0xff&&&((int)&yuv420sp[yp]))&-&16;&&&&&&&&&&&&&&&&if&(y&&&0)&&&&&&&&&&&&&&&&&&&&y&=&0;&&&&&&&&&&&&&&&&if&((i&&&1)&==&0)&{&&&&&&&&&&&&&&&&&&&&v&=&(0xff&&&yuv420sp[uvp++])&-&128;&&&&&&&&&&&&&&&&&&&&u&=&(0xff&&&yuv420sp[uvp++])&-&128;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&int&y1192&=&1192&*&y;&&&&&&&&&&&&&&&&int&r&=&(y1192&+&1634&*&v);&&&&&&&&&&&&&&&&int&g&=&(y1192&-&833&*&v&-&400&*&u);&&&&&&&&&&&&&&&&int&b&=&(y1192&+&2066&*&u);&&&&&&&&&&&&&&&&if&(r&&&0)&&&&&&&&&&&&&&&&&&&&r&=&0;&&&&&&&&&&&&&&&&else&if&(r&&&262143)&&&&&&&&&&&&&&&&&&&&r&=&262143;&&&&&&&&&&&&&&&&if&(g&&&0)&&&&&&&&&&&&&&&&&&&&g&=&0;&&&&&&&&&&&&&&&&else&if&(g&&&262143)&&&&&&&&&&&&&&&&&&&&g&=&262143;&&&&&&&&&&&&&&&&if&(b&&&0)&&&&&&&&&&&&&&&&&&&&b&=&0;&&&&&&&&&&&&&&&&else&if&(b&&&262143)&&&&&&&&&&&&&&&&&&&&b&=&262143;&&&&&&&&&&&&&&&&//&rgb[yp]&=&0xff000000&|&((r&&&&6)&&&0xff0000)&|&((g&&&&2)&&&&&&&&&&&&&&&&&&//&0xff00)&|&((b&&&&10)&&&0xff);&&&&&&&&&&&&&&&&//&rgba,&divide&2^10&(&&&&10)&&&&&&&&&&&&&&&&rgba[yp]&=&((r&&&&14)&&&0xff000000)&|&((g&&&&6)&&&0xff0000)&&&&&&&&&&&&&&&&&&&&&&&&|&((b&&&&2)&|&0xff00);&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&/**&&&&&*&Converts&YUV420&NV21&to&RGB8888&&&&&*&&&&&&*&@param&data&&&&&*&&&&&&&&&&&&byte&array&on&YUV420&NV21&format.&&&&&*&@param&width&&&&&*&&&&&&&&&&&&pixels&width&&&&&*&@param&height&&&&&*&&&&&&&&&&&&pixels&height&&&&&*&@return&a&RGB8888&pixels&int&array.&Where&each&int&is&a&pixels&ARGB.&&&&&*/&&&&public&static&void&convertYUV420_NV21toRGB8888(int[]&rgba,&byte[]&data,&&&&&&&&&&&&int&width,&int&height)&{&&&&&&&&int&size&=&width&*&&&&&&&&&int&offset&=&&&&&&&&&//&int[]&pixels&=&new&int[size];&&&&&&&&int&u,&v,&y1,&y2,&y3,&y4;&&&&&&&&//&i&percorre&os&Y&and&the&final&pixels&&&&&&&&//&k&percorre&os&pixles&U&e&V&&&&&&&&for&(int&i&=&0,&k&=&0;&i&&&&i&+=&2,&k&+=&2)&{&&&&&&&&&&&&y1&=&data[i]&&&0&&&&&&&&&&&&y2&=&data[i&+&1]&&&0&&&&&&&&&&&&y3&=&data[width&+&i]&&&0&&&&&&&&&&&&y4&=&data[width&+&i&+&1]&&&0&&&&&&&&&&&&u&=&data[offset&+&k]&&&0&&&&&&&&&&&&v&=&data[offset&+&k&+&1]&&&0&&&&&&&&&&&&u&=&u&-&128;&&&&&&&&&&&&v&=&v&-&128;&&&&&&&&&&&&rgba[i]&=&convertYUVtoRGB(y1,&u,&v);&&&&&&&&&&&&rgba[i&+&1]&=&convertYUVtoRGB(y2,&u,&v);&&&&&&&&&&&&rgba[width&+&i]&=&convertYUVtoRGB(y3,&u,&v);&&&&&&&&&&&&rgba[width&+&i&+&1]&=&convertYUVtoRGB(y4,&u,&v);&&&&&&&&&&&&if&(i&!=&0&&&&(i&+&2)&%&width&==&0)&&&&&&&&&&&&&&&&i&+=&&&&&&&&&}&&&&&&&&//&return&&&&&}&&&&private&static&int&convertYUVtoRGB(int&y,&int&u,&int&v)&{&&&&&&&&int&r,&g,&b;&&&&&&&&r&=&y&+&(int)&1.402f&*&v;&&&&&&&&g&=&y&-&(int)&(0.344f&*&u&+&0.714f&*&v);&&&&&&&&b&=&y&+&(int)&1.772f&*&u;&&&&&&&&r&=&r&&&255&?&255&:&r&&&0&?&0&:&r;&&&&&&&&g&=&g&&&255&?&255&:&g&&&0&?&0&:&g;&&&&&&&&b&=&b&&&255&?&255&:&b&&&0&?&0&:&b;&&&&&&&&return&0xff000000&|&(b&&&&16)&|&(g&&&&8)&|&r;&&&&}&&&&//&@Override&&&&//&public&boolean&onCreateOptionsMenu(Menu&menu)&{&&&&//&//&Inflate&the&&this&adds&items&to&the&action&bar&if&it&is&present.&&&&//&getMenuInflater().inflate(R.menu.activity_main,&menu);&&&&//&return&&&&&//&}&&&&public&native&String&stringFromJNI();&&&&private&native&void&setVideoSurface(Surface&surface);&&&&private&native&void&test(Surface&surface);&&&&private&native&void&test2(Surface&surface);&&&&private&native&void&drawYUV(int[]&yuvData);&&&&static&{&&&&&&&&System.loadLibrary("drawSurface");&&&&}}最后是mk文件&# Copyright (C) 2009 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## & & &http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#LOCAL_LDFLAGS += -lstdc++LOCAL_PATH := $(call my-dir)MY_ANDROID_SOURCE := D:/Android_Source/mydroidinclude $(CLEAR_VARS)LOCAL_LDLIBS :=-llog \ D:/app/libutils.so \ D:/app/libgui.so \ D:/app/libui.soLOCAL_MODULE & &:= drawSurfaceLOCAL_SRC_FILES := drawSurface.cLOCAL_SRC_FILES += &\ invoked.cppLOCAL_SHARED_LIBRARIES := \ libskia\ libsurfaceflinger\& & libgui\& & D:/app/libutils\& & D:/app/libguiLOCAL_C_INCLUDES += \ $(MY_ANDROID_SOURCE)/frameworks/native/include \ $(MY_ANDROID_SOURCE)/system/core/include \ $(MY_ANDROID_SOURCE)/hardware/libhardware/include \ $(JNI_H_INCLUDE)include $(BUILD_SHARED_LIBRARY)&思路呢一开始在网上找到jni层代码后,开始编译链接由于Surface的定义在NDK中没有,只有下载安卓源码才行意识到这个问题也是看了好多篇帖子才转过弯来&mk文件中一个一个添加上头文件后,又遇到一些函数找不到的问题怎么办?先根据提示,看找不到的函数在哪个头文件里,然后去头文件对应的cpp文件所在的文件夹,然后打开该文件夹下的mk文件看看生成的是哪个库,然后利用adb把模拟器里相应的库pull下来路径 添加到mk文件中&总算是弄成功了虽然特定区域画图还存在问题&&思路:一开始碰到函数找不到,师兄说安卓so里 肯定有怎么找so,想到mk文件果然成功&一般性总结:遇到问题,把想到的所以思路都一条一条写下来。然后一个一个去试。仔细,耐心&&&&&&
阅读(...) 评论()离散点插值方法、等值线的绘制及平滑技巧_小组_ThinkSAAS
离散点插值方法、等值线的绘制及平滑技巧
离散点插值方法、等值线的绘制及平滑技巧
离散点插值方法、等值线的绘制及平滑技巧
吕勇平 戴景茹
(广东省气候应用研究所 510080)
  由于等值线图看起来非常直观、形象,因此在天气预报、气候预测分析等方面用得非常多,已成为预报员不可缺少的工具之一。如各等压面层的位势高度图、高空环流、温度及降水分布图等等。目前也有一些非常好的微机用绘图软件,如SUFER、GRADS 等。这些软件一般都只有DOS 版,在流行的WINDOWS平台上,虽然可以调用,但不能使用鼠标操作,故不如使用在WINDOWS 环境中开发的软件方便。因此,许多希望在自己开发的应用程序中能方便地显示及打印各类等值线图的人,都想知道绘制等值线图的原理方法。如何用格点资料绘制等值线图在文献〔1〕中已有介绍,而离散点(如气象台站) 的资料必须通过插值才能绘制等值线图。插值的方法有几种,比如三角网插值,它是将相邻的三个点连成一个个三角形,然后用文献〔1〕介绍的追踪法或其它方法在三角形边上进行插值。此方法的优点是需要插的值少,插值算法简单,数据处理量少。缺点是三角网的生成随意性很大,任意四个点可生成二组不同的三角形,不同的三角网插值得出的等值线也不可能完全相同。若人为固定三角网,当有资料缺测时,就不得不重新调整三角网,因此程序的通用性不高。目前比较流行的是通用性好的网格化方法。
1  离散点网格化
  理论上,离散点网格化可采用局部曲面拟
合方法,用多元回归方法建立
V ( X , Y) = a + bX + c Y
或二次方程
V ( X , Y) = a + bX + c Y + dX2 + eY2 + f X Y
所谓局部,是指采用拟合点周围一定范围的部
分离散点进行拟合。这种做法虽然在许多情
况下效果不错,但通常总是有些地方与实际情
况有较大出入。因此根据人工绘制等值线时
的直接内插方式,采用以下几个步骤。
111  定 点
(1) 根据离散点的分布范围确定整个网格
的范围及网格距,网格距不宜过大或过细。
(2) 确定每个离散点属于哪一个网格,也
即每个网格包含哪些离散点。
(3) 在欲插值的网格点周围一定范围内
(约3~4 个网格距如图1) ,按其4 个象限各
找一个合适的离散点,剔除距离插值点最远的
一个点(或其对面象限的点,使网格点处于另
三点组成的三角形之内) 。若有2 个象限找不
到离散点,则要判别是否有已插值的格点值可
替代,若也没有已插值可替代,则该格点暂时
不插值,并记下该格点位置,留最后补插值。
图1  离散点网格化
找合适点的原则:
A bs ( Xi - X0) ×A + A bs ( Yi - Y0) ×B = 最小
式中:X0 、Y0 ———为网格点坐标,
A、B ———为权重系数, (可根据其相邻象
限有无离散点不断调整) 。
112  插 值
当某离散点与网格点距离小于011 个网
9 6 199814 (增2)               广东气象
Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
格距时,可近似作为该网格点值。
一般情况下,先由3 个点插出与纬向线相
交点的2 个值,最后这2 个值内插出网格点上
的值。为了使内插值更准确,可以考虑所选的
3 个离散点各点与网格点的距离,内插时乘上
权重系数,距离越近权重系数越大。
当4 个离散点的值如图2 的情况时,有可
能是高中心,正常插值肯定小于这4 个点的最
大值,不成为高中心,因此要根据周围离散点
的值作特殊处理。
图2  高中心特殊处理
113  补 插
将初次无法进行插值记录下来的格点,重
新检查是否可插值。
114  外围点插值
采用此方法插值,得到的网格点值只能在
外围离散点所包的范围内。为了使插值的网
格点尽可能包围外围离散点,可以在外围采用
外延的方法,将插值网格点扩大一圈。方法
是:对于任一个无插值网格点,在其周围应有
8 个(边线上5 个) 方向,任何一个方向,只要
最近的两个格点有值,则可外推出该格点值,
将8 方向可能推出的两个以上的值求算术平
均作为该格点的插值。
115  技 巧
为方便下一步连等值线,所有格点的值不
要与等值线的值相等,可对插出的格点值增减
一个非常小的值ε(如0101) 。若周围有一个
格点的值比该值大,则减去ε,否则加上ε。
2  绘制等值线
  网格点资料如何绘制等值线,文献〔1〕介
绍了直接追踪法, 这里介绍另一种方法。
(1) 先将每个已插值的网格点与其右边及
下边两个网格点值进行比较,若满足条件
Sgn ( Z( x , y) - Z0) + Sgn ( Z ( x + 1 , y) - Z0) = 0
则记录一竖线段两个坐标
Sgn ( Z( x , y) - Z0) + Sgn ( Z ( x , y + 1) - Z0) = 0
则记录一横线段两个坐标
式中: Z ( 3 ) ———格点值;
Z0 ———等值线的值;
Sgn (  ) ———求正负号函数。
即把所有格点值看成只有两值,一是大于
Z0 ,一是小于Z0 (前面插值处理使任何一格点
值不等于Z0) ,最后可得到若干条线段(图3) 。
图3  两值化的等值线图
(2) 线段连接。对于某一线段X , 根据其
终点,顺序查找与之共点的起点或终点的线段
Y ,确定他们相连关系,根据线段X 两边格点
值插出等值线值的位置,作为等值线的一个点
坐标并记录下来。再根据Y 的终点或起点继
续查找..,当再也找不到时,即为该连线的
一个端点,同样要插值确定并记录该线终点坐
标。再回过头从线段X 的起点继续找,直至
找到另一个端点。当等值线起点终点属于同
一个网格时,该等值线是闭合的。
当某一线段起点终点均找不到与之相连
的其它线段时,可以考虑不要该线段。当某一
线段一头与另外3 个线段共点时(如图4) ,即
图4  多线段共点
0 7 广东气象         1998. 4 (增2)
Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
当等值线的值为10 时,按顺序会记下4 个线
段A、B、C、D ,4 个线段的都有一个共同的端
点。这种情况下则应根据等值线值与4 个格
点值,按相互间距离最近的两个相连,另外两
个相连来处理(图中虚线) 。
(3) 当组成一条折线的点少于4 时,可以
不要该条折线。
3  等值线的平滑
  前面连成的等值线,其实是一条条折线,
当网格距足够小时(可在粗网格上插细网格) ,
这些折线看起来就比较平滑。但这样处理有
两个缺点,一是要做很细的网格插值,但无论
如何细,曲线还是会随着图形的放大而逐渐变
成了折线。二是要记录很细的格点值及等值
线,可能就要开一个很大的数组,若要存放在
磁盘上则会占用较大的磁盘容量。为节省存
储空间,又要较精确地描绘曲线,唯一的办法
是增加数据处理工作量,必须从折点数据中找
到一系列的函数关系,使之完全通过这些折
点。根据这些函数加密数据点画出的折线是
看起来是连续而平滑的。图形越放大,需加密
数据点越多。目前,采用的平滑方法有多项式
拟合、样条函数、拉格郎日插值函数、斜轴抛物
线平均加权法等方法进行逐段拟合。不管是
哪种方法,直接使用都可能会出现不合理的情
况(图5) ,解决办法是先对拟合点或自变量作
些初步处理或称预处理,最后进行坐标(旋转)
变换后,用拉格郎日插值函数绘制平滑曲线。
图5  直接插值曲线
311  预处理
(1) 检查闭合线
当一条曲线的第一点与最后一点同属一
个网格时,则可以认为这条线是闭合的,在最
后点之后加上第一点坐标作为最后点。
(2) 合并紧邻点
相连的两个点距离小于012 个网格距时,
可在中间插一个点,而将这两个点取消。
(3) 将大折角减小
当3 个相邻点之间的夹角小于一定角度
时,通过逐步调整3 个点的Y 坐标,将夹角加
大(角β减小) 。可以通过多次的合并及减小
折角,使得曲线逐步平滑。
312  配函数绘线
加密数据点的拉氏插值函数程序如下:
For I = 1 To N :Z( I) = 1 :Next I
For I = 1 To N :For J = 1 To N
  If I & &J Then Z(J ) = Z(J ) ×(XX -
X( I) ) / (X(J ) - X( I) )
Next J :Next I
YX = 0 : For I = 1 To N : YX = YX + Z( I)
×Y( I) :Next I
N 是样本点数, 对应数组X ( ) 、Y ( ) ,
XX 是插值X 坐标, Y X 是插出的Y 坐标。
采用3 点样本插值的具体做法是:
(1) 采用3 点在第一、二点之间进行插值。
(2) 为了避免出现如图5 那样的不合理插
值,可采用坐标转换方式。即根据第一点与第
二点连线和第二点与第三点连线的夹角来确
定新坐标旋转角度γ(图6) ,使角α等于角β。
(3) 在新的坐标系下进行第一、二点之间
进行插值。插值步长可以根据网格距大小及
图6  确定新坐标旋转角(
下转第73 页)
1 7 199814 (增2)               广东气象
Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
数据文件调入后,返回Random 子菜单选
择Output , 填入输出文件名, 扩展名应为
1GRD ,然后选择Begin 即可将输入文件网格
化,生成输出文件。
Begin 生成的1GRD 文件,产生的数据分
布在给定的经、纬度极大值、极小值之间的每
一段。若直接由TOPO1EXE 调用,等值线将
布满整张图。为了不出现等值线,必须使用
Modify 进行空白化处理,空白化步骤如下:
(1) 编辑一空白化文件, 扩展名为生成
1BLN。格式:第一行: (点数- 1)  0
第二行:第一点横坐标(经度)  第一点纵
坐标(纬度)
第三行:第二点横坐标(经度)  第二点纵
坐标(纬度)
这些点相联成的闭合区域外将空白化。
(2) 在主菜单依次选择Modify →Blank ,出
在Input grid file : 填入欲空白化的
1GRD 文件,在Output grid file : 填入输
出文件,扩展名1GRD ,
在Blank file : 填入上一步生成的
1BLN 文件,
在Begin creating grid with current param2
eters ? 填YES ,即空白化生成输出文件。
312  运行TOPO1EXE
主菜单如下:
[ Topo ] Input Level Scale Conline Title
Border Xyline Grid Post Output Equip
用到的各选项功能如下:
Input :填入输入文件名,它是GRID1EXE
的输出文件。
Level :调整等值线的最大、最小值、间距。
Scale :调节屏幕图形的大小(F2 键显示) 。
Title :输入标题。
Post :将单点及其数值标注在指定位置,
若在此填入地图文件名,可调入地图。
Output :将显示的图形输出打印。
4  全屏幕修改
  SURFER 软件包绘制的等值线精度高,
光滑不足,可进行全屏幕修改。
F2 显示后再按任意键,图上出现一小十
字架,按AL T - E ,屏幕底部出现下面的字样:
X = 110  Y = 25  Z = 19173  ESC  
AL T - S  OR  NEW  Z:
表示当前小十字架坐标为(110 ,25) ,数值
为19173 ,填入新的Z 值,就可部分修改图形。
修改后的图形可按AL T - S 存盘。
5  等值线标值标准化
  上述方法绘制的等值线上标值有的没有,
有的多于两个,这是SURFER 的缺陷。笔者
对程序进行了修正,可绘制出等值线标值标准
的气候图。其基本思路是:采用汇编编译器找
出此部分地址,将修改后的子程序写入。
(上接第71 页) 图的放大倍数由程序自动确定。
每一个插值要还原到原坐标系下进行连线。
(4) 这样我们可用1 、2 、3 点绘出1 、2 点之
间曲线,2 、3 、4 点绘出2 、3 点之间曲线,最后2
点的曲线,只须将最后一点与倒数第三点调换
位置,调用同一个子程序便可绘出。
4  不足之处
  由于不能插出比样本离散点最大值更大
或最小值更小的值,因此,当高(低) 中心的离
散点的值只比等值线的值略大时,绘出的高
(低) 中心最内的闭合线所包围的面积比手工
绘的要小,这种情况需作进一步的改进。
1  冯业荣,谷德军1DOS 下天气图形的屏幕表现和识别
(四) 1 广东气象,199614
3 7 199814 (增2)               广东气象
Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。

我要回帖

更多关于 怎么编写程序 的文章

 

随机推荐