用C++或者OpenGL或者Ogre实现鼠标移动轨迹

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C++或者OpenGL或者Ogre实现鼠标移动轨迹相关的知识,希望对你有一定的参考价值。

所谓鼠标移动轨迹,就是指拖动鼠标左键,可以用一条不消失的曲线记录下鼠标移动的轨迹。
要求使用C++或者OpenGL或者Ogre来实现。请给出一个思路即可,具体代码我来写。因为我现在能想到的方案效率都不高。
如果具体思路中需要使用标准容量库,请详细说明,因为我对这块还不是很理解。

这么简单的功能根本不需要图形库,用mfc就搞定了。
首先在鼠标左键按下里,记录下起点

然后再鼠标移动事件里,记录下鼠标当前位置,用一个数组保存,同时绘制出这个点和上个点间的线段。

最后在鼠标抬起事件里,完成点坐标的记录。

需要在重绘函数里添加整个轨迹的绘制操作,这样绘制的轨迹不会被擦除。

若要实现CAD交互绘图的拖拽效果,可以使用SetROP2这个函数。
参考技术A 这和OpenGL或Ogre有什么关系么。。

用一个容器比如标准库的vector不断记录发给窗体的WM_MOUSEMOVE消息的坐标,然后依次绘制直线即可。用GDI的LineTo就搞定了。

地图中的鼠标移动响应

概述:

假设如下场景:首先地图加载一个WMS或者切片,wms为POI或者切片上有POI,我们知道WMS或者切片是无法做到像Marker或者矢量的事件相应的,但是我们又需要对这些POI点进行响应,这就不太好办了。基于此想法,本文讲述此想法的实现思路以及OL2和Arcgis中的实现方式。


思路:

实现的关键是注册两个map的事件:1、四至发生变化的时候;2、鼠标移动的时候。

1、四至发生变化

当地图的四至发生变化时,我们需要将变化后四至内的POI点的数据返回到前台进行下一步处理,返回的逻辑可以采用一次性全部返回或者分区域返回,分区域返回的优势是减少数据的传输量,但是分区域返回时需要结合鼠标移动的同时响应的。


2、鼠标移动的时候

当获取到了当前区域的POI数据,当鼠标移动时,以鼠标点为中心,当前地图的分辨率*图标大小为长宽,创建一个正方形,去循环判断POI点是否落在的该正方形内,是,响应;否,返回。


效果:

1、OL2中


2、Arcgis for js



实现:

1、OL2中

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>openlayers map</title>
    <link rel="stylesheet" href="../../../plugin/OpenLayers-2.13.1/theme/default/style.css" type="text/css">
    <style>
        html, body, #map{
            padding:0;
            margin:0;
            height:100%;
            width:100%;
            overflow: hidden;
        }
        .highlight-poi-label{
        	background-color: #ffffff;
		    color:#000000;
		    border: solid 1px #1E90F5;
		    border-radius: 3px;
		    font-size: 12px;
		    padding: 2px 5px;
		    white-space:nowrap;
		    position:absolute;
		    z-index: 999;
        }
    </style>
    <script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
    <script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
    <script>
        var map;
        var tiled;
        $(window).load(function() {
            var format = 'image/png';
            var bounds = new OpenLayers.Bounds(
                    73.45100463562233, 18.16324718764174,
                    134.97679764650596, 53.531943152223576
            );
            var options = {
                controls: [],
                maxExtent: bounds,
                maxResolution: 0.2403351289487642,
                projection: "EPSG:4326",
                units: 'degrees'
            };
            map = new OpenLayers.Map('map', options);
            tiled = new OpenLayers.Layer.WMS(
                    "Geoserver layers - Tiled",
                    "http://localhost:8088/geoserver/lzugis/wms",
                    {
                        "LAYERS": 'capital',
                        "STYLES": '',
                        format: format
                    },
                    {
                        buffer: 0,
                        displayOutsideMaxExtent: true,
                        isBaseLayer: true,
                        yx : {'EPSG:4326' : true}
                    }
            );
            map.addLayers([tiled]);
            map.addControl(new OpenLayers.Control.Zoom());
            map.addControl(new OpenLayers.Control.Navigation());
            map.zoomToExtent(bounds);
            var features =[];
            $.ajax({
		    	url: "data/capital.geojson",
		    	async: false,
		    	success:function(result){
                    result = eval("("+result+")");
                    var geojson_format = new OpenLayers.Format.GeoJSON();
                    features = geojson_format.read(result);
            	}
		    });
            map.events.register("mousemove", map, function(e){
            	$(".highlight-poi-label").remove();
            	map.layerContainerDiv.style.cursor = "default";
            	var lonlat = map.getLonLatFromPixel(e.xy);
		    	var offset = map.resolution*5;
		    	var xmin = lonlat.lon-offset,
		    		ymin = lonlat.lat-offset,
		    		xmax = lonlat.lon+offset,
		    		ymax = lonlat.lat+offset;
		    	for(var i in features){
		    		var feature = features[i];
		    		var geom = feature.geometry;
		    		var _ptx = geom.x,_pty = geom.y;
		    		if(_ptx>=xmin&&_ptx<=xmax&_pty>=ymin&&_pty<=ymax){
		                map.layerContainerDiv.style.cursor = "pointer";
		                var scrPt = map.getViewPortPxFromLonLat(new OpenLayers.LonLat(_ptx, _pty));
		                var orgPx = map.layerContainerOriginPx;
		                var labelDiv = $("<div/>").addClass("highlight-poi-label").css("top",(scrPt.y-orgPx.y+15)+"px")
		                	.css("left",(scrPt.x-orgPx.x+17)+"px").html(feature.attributes.name);
		                $(map.layerContainerDiv).append(labelDiv);
		            }
		    	}
            });
        });
    </script>
</head>
<body>
<div id="map">
</div>
</body>
</html>


2、Arcgis for js

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title></title>
    <link rel="stylesheet" href="http://localhost/arcgis_js_311/api/arcgis_js_api/library/3.11/3.11/esri/css/esri.css">
    <style type="text/css">
        html, body, #map {
            height: 100%;
            margin: 0;
            padding: 0;
            font-size: 62.5%;
            font-family:"Segoe UI","Helvetica Neue",Helvetica,Arial,sans-serif;
            overflow: hidden;
        }
        .highlight-poi-label{
        	background-color: #ffffff;
		    color:#000000;
		    border: solid 1px #1E90F5;
		    border-radius: 3px;
		    font-size: 12px;
		    padding: 2px 5px;
		    white-space:nowrap;
		    position:absolute;
		    z-index: 999;
        }
    </style>
    <script src="http://localhost/arcgis_js_311/api/arcgis_js_api/library/3.11/3.11/init.js"></script>
    <script src="../../plugin/jquery/jquery-2.2.3.min.js"></script>
    <script type="text/javascript">
        var map;
        require([
                    "esri/map",
                    "esri/layers/WMSLayer",
                    "esri/geometry/Point",
                    "esri/geometry/Extent",
                    "dojo/domReady!"],
                function(Map,
                         WMSLayer,
                         Point,
                         Extent)
                {
                    map = new Map("map",{logo:false});

                    var resourceInfo = {
                        extent: new Extent(-126.40869140625,31.025390625,-109.66552734375,41.5283203125,{wkid: 4326}),
                        layerInfos: [],
                        version : '1.1.1'
                    };
                    var geoWmsUrl = "http://localhost:8088/geoserver/wms";
                    var geoWmsLayer = new WMSLayer(geoWmsUrl,{resourceInfo: resourceInfo});
                    geoWmsLayer.setImageFormat("png");
                    geoWmsLayer.setVisibleLayers(["capital"]);
                    map.addLayer(geoWmsLayer);
                    var mapCenter = new Point(103.847, 36.0473, map.spatialReference);
                    map.centerAndZoom(mapCenter,4);
                    var features =[];
            		$.ajax({
					    url: "data/capital.geojson",
					    async: false,
					    success:function(result){
			                features = eval("("+result+")");
			                features = features.features;
			            }
					});
                    map.on("mouse-move", function(e){
					    $(".highlight-poi-label").remove();
            			map.setMapCursor("default");
            			var offset = map.getResolution()*5;
            			var mapPt = e.mapPoint;
            			var xmin = mapPt.x-offset,
				    		ymin = mapPt.y-offset,
				    		xmax = mapPt.x+offset,
				    		ymax = mapPt.y+offset;
				    	for(var i in features){
				    		var feature = features[i];
				    		var _ptx = feature.geometry.coordinates[0],
				    			_pty = feature.geometry.coordinates[1];
				    		if(_ptx>=xmin&&_ptx<=xmax&_pty>=ymin&&_pty<=ymax){
				    			map.setMapCursor("pointer");
				                var scrPt = map.toScreen(new Point(_ptx, _pty, map.spatialReference))
				                var labelDiv = $("<div/>").addClass("highlight-poi-label").css("top",(scrPt.y+15)+"px")
				                	.css("left",(scrPt.x+17)+"px").html(feature.properties.name);
				                $("#"+map.id).append(labelDiv);
				    		}
				    	}
					});
                });
    </script>
</head>
<body>
<div id="map">
</div>
</body>
</html>

---------------------------------------------------------------------------------------------------------------

技术博客

http://blog.csdn.NET/gisshixisheng

在线教程

http://edu.csdn.Net/course/detail/799
Github

https://github.com/lzugis/

联系方式

q       q:1004740957

e-mail:niujp08@qq.com

公众号:lzugis15

Q Q 群:452117357(webgis)
             337469080(Android)



以上是关于用C++或者OpenGL或者Ogre实现鼠标移动轨迹的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - C++:Opengl Development Cookbook 中的免费相机

如何在 C++ 中使用 sdl、opengl 移动相机时修复奇怪的相机旋转

OpenGL用鼠标移动画圆

win32(非MFC) 用OpenGL 怎么实现单击鼠标左键选取A点,然后在B点处单击鼠标右键,使A点移动到B点,急用,谢

opengl如何实现鼠标场景漫游 视点随着鼠标的移动发生变化 刚刚接触opengl所以不大懂(不用glut的情况下)

opengl导入一个3维物体,如何修改其局部坐标系?