首先我们来看下要实现的效果

这个缩小后的图片,下面我们来看下近距离的动态效果。。

效果比较简陋,需要后期再处理。。。

下面进入主题,代码篇。。

HTML部分:

全球航班

html{overflow: hidden;}

body { margin: 0;}

web前端开发学习Q-q-u-n: 731771211,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频,PDF)

JS部分(globe.js)

1、实现地球

地球贴图(可以在网上下载)

// 地球

function globe() {

var globeTextureLoader = new THREE.TextureLoader();

globeTextureLoader.load('images/textures/earth.jpg', function (texture) {

var globeGgeometry = new THREE.SphereGeometry(200, 100, 100);

var globeMaterial = new THREE.MeshStandardMaterial({map: texture});

var globeMesh = new THREE.Mesh(globeGgeometry, globeMaterial);

group.add(globeMesh);

group.rotation.x = THREE.Math.degToRad(35);

group.rotation.y = THREE.Math.degToRad(170);

});

}

2、添加球面光源(这里使用的是半球光)

// 光

function lights() {

var hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x333333, 2);

hemisphereLight.position.x = 0;

hemisphereLight.position.y = 0;

hemisphereLight.position.z = -200;

group.add(hemisphereLight);

}

3、添加星点

// 星点

function stars() {

var starsGeometry = new THREE.Geometry();

for (var i = 0; i < 2000; i ++) {

var starVector = new THREE.Vector3(

THREE.Math.randFloatSpread(2000),

THREE.Math.randFloatSpread(2000),

THREE.Math.randFloatSpread(2000)

);

starsGeometry.vertices.push(starVector);

}

var starsMaterial = new THREE.PointsMaterial({color: 0x888888})

var starsPoint = new THREE.Points(starsGeometry, starsMaterial);

group.add(starsPoint);

}

4、添加飞机

这里需要我们把 经纬度坐标 转成 xyz 坐标

// 获取position

function getPosition(lng, lat, alt) {

var phi = (90-lat)*(Math.PI/180),

theta = (lng+180)*(Math.PI/180),

radius = alt+200,

x = -(radius * Math.sin(phi) * Math.cos(theta)),

z = (radius * Math.sin(phi) * Math.sin(theta)),

y = (radius * Math.cos(phi));

return {x: x, y: y, z: z};

}

画飞机

// 飞机形状(不想画的,可以下载个 飞机模型 使用加载器加载进来)

var planeShape = new THREE.Shape();

planeShape.moveTo( 0, 0);

planeShape.lineTo(0.2, -0.2);

planeShape.lineTo(0.2, -1.3);

planeShape.lineTo(1.6,-2.7);

planeShape.lineTo(1.6,-3);

planeShape.lineTo(0.2, -2.1);

planeShape.lineTo(0.2, -3);

planeShape.lineTo(0.5, -3.4);

planeShape.lineTo(0.5, -3.7);

planeShape.lineTo(0, -3.3);

planeShape.lineTo(-0.5, -3.7);

planeShape.lineTo(-0.5, -3.4);

planeShape.lineTo(-0.2, -3);

planeShape.lineTo(-0.2, -2.1);

planeShape.lineTo(-1.6,-3);

planeShape.lineTo(-1.6,-2.7);

planeShape.lineTo(-0.2, -1.3);

planeShape.lineTo(-0.2, -0.2);

var planeGeometry = new THREE.ShapeGeometry(planeShape);

// 飞机材质

var planeMaterial = new THREE.MeshPhongMaterial({color: 0x0FB4DD, side: THREE.DoubleSide, depthTest: true});

web前端开发学习Q-q-u-n: 731771211,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频,PDF)

depthTest作用是能否透过球体看到飞机,如果是false则旋转到球体另一面也能看到飞机

添加飞机

// 添加飞机

function addPlane(item) {

if(item.anum && item.lng && item.lat) {

var plane = new THREE.Mesh(planeGeometry, planeMaterial);

// 旋转

plane.rotation.z = THREE.Math.degToRad(item.ang);

// 定位

var position = getPosition(item.lng, item.lat, 5);

plane.position.set(position.x, position.y, position.z);

// 显示/隐藏

// plane.visible = false;

// 保存

planeMarkers[item.anum] = plane;

// 添加到场景

group.add(plane);

// 绘制历史轨迹

drawHistoryTrack(item.anum);

}

}

绘制轨迹(使用socket来获取的飞行轨迹经纬度坐标点)

// 时间段

var curTime = Date.parse(new Date())/1000;

var depTime = curTime - 30*60;

// 轨迹线质

var trackMaterial = new THREE.LineBasicMaterial({color : 0x1B94B1});

// 绘制历史轨迹

function drawHistoryTrack(anum) {

socket.emit("fullPath", anum, depTime, curTime, function(status, data){

if(status) {

var dLength = data.length;

if(dLength>=2) {

var trackCoordArr = [];

for(var i=0; i

if(data[i].lng && data[i].alt) {

trackCoordArr.push({lng: data[i].lng, lat: data[i].lat});

}

}

var tcaLength = trackCoordArr.length;

if(tcaLength>=2) {

var tcaHalfLength = Math.ceil(tcaLength/2),

vertexArr = [];

// 这里只取了三个点(起点、中点、终点)

var p1 = getPosition(trackCoordArr[0].lng, trackCoordArr[0].lat, 0),

p2 = getPosition(trackCoordArr[tcaHalfLength].lng, trackCoordArr[tcaHalfLength].lat, tcaLength*0.01),

p3 = getPosition(trackCoordArr[tcaLength-1].lng, trackCoordArr[tcaLength-1].lat, 0);

var trackCurve = new THREE.CatmullRomCurve3([

new THREE.Vector3(p1.x, p1.y, p1.z),

new THREE.Vector3(p2.x, p2.y, p2.z),

new THREE.Vector3(p3.x, p3.y, p3.z)

]);

var trackGeometry = new THREE.Geometry(),

verticesArr = trackCurve.getPoints(tcaLength);

trackGeometry.vertices = verticesArr;

var trackLine = new THREE.Line(trackGeometry, trackMaterial);

group.add(trackLine);

// 动画点

addLightPoint(p1, tcaLength, verticesArr);

}

}

}

});

}

如果要绘制所有点,且头尾是在球面上的曲线,则需要两次循环

var tcaRemainLength = tcaLength-tcaHalfLength

for(var j=0; j

var p1 = getPosition(trackCoordArr[j].lng, trackCoordArr[j].lat, j*0.05);

vertexArr.push(new THREE.Vector3(p1.x, p1.y, p1.z));

}

for(var k=tcaRemainLength; k>0; k--) { // 后一半

var p2 = getPosition(trackCoordArr[tcaLength-k].lng, trackCoordArr[tcaLength-k].lat, k*0.05);

vertexArr.push(new THREE.Vector3(p2.x, p2.y, p2.z));

}

var trackCurve = new THREE.CatmullRomCurve3(vertexArr);

这个部分看看就行了。。

光点动画

// 点动画

var pointGeometry = new THREE.SphereGeometry(0.2, 20, 20);

var pointMaterial = new THREE.MeshBasicMaterial({color: 0x40E0D0});

function addLightPoint(pos, coordsNum ,verArr) {

var pointMesh = new THREE.Mesh(pointGeometry, pointMaterial);

pointMesh.position.set(pos.x, pos.y, pos.z);

group.add(pointMesh);

var index = 0;

function pointAnimate() {

index++;

if(index>coordsNum) {

index = 0;

}

pointMesh.position.set(verArr[index].x, verArr[index].y, verArr[index].z);

requestAnimationFrame(pointAnimate);

}

pointAnimate();

}

这个点使用的是sphere,,当然也可以用顶点来实现,如下

var geometry = new THREE.Geometry();

geometry.vertices.push(new THREE.Vector3(0, 0, 0))

geometry.colors.push(new THREE.Color(0xffffff));

var material = new THREE.PointsMaterial({size: 1, vertexColors: THREE.VertexColors, opacity: 0.75, sizeAttenuation: true, transparent: true});

var point = new THREE.Points(geometry, material);

point.position.set(x, y, z);

group.add(point);

另外不想用光点动画的话,也可以用线动画,实现原理是不断更新顶点坐标,如下

var curveGeometry = new THREE.Geometry();

var curveData = new THREE.CatmullRomCurve3(verArr.slice(0, 10));

curveGeometry.vertices = curveData.getPoints(10);

var curveMaterial = new THREE.LineBasicMaterial({color: 0x40E0D0});

var curveLine = new THREE.Line(curveGeometry, curveMaterial);

group.add(curveLine);

var index = 0;

function lineAnimate() {

index++;

if(index>coordsNum-10) {

index = 0;

}

var offsetData = verArr.slice(index, 10+index);

if(offsetData.length > 0) {

curveData = new THREE.CatmullRomCurve3(offsetData);

curveLine.geometry.vertices = curveData.getPoints(10);

curveLine.geometry.verticesNeedUpdate = true;

}

requestAnimationFrame(lineAnimate);

}

lineAnimate();

最后就是布置场景和事件了

// 初始化

function init() {

container = document.getElementById('zh_globe_container');

scene = new THREE.Scene();

var bgTexture = new THREE.TextureLoader().load("images/textures/starfield.jpg");

scene.background = bgTexture;

camera = new THREE.PerspectiveCamera(50, winWth/winHgt, 1, 2000);

camera.up.x = 0;

camera.up.y = 1;

camera.up.z = 0;

camera.position.x = 0;

camera.position.y = 0;

camera.position.z = 400;

camera.lookAt(0,0,0);

group = new THREE.Group();

scene.add(group);

// 地球

globe();

// 飞机

plane();

// 星点

stars();

// 半球光

lights();

// 渲染器

renderer = new THREE.WebGLRenderer({antialias: true, preserveDrawingBuffer: true});

renderer.setPixelRatio(window.devicePixelRatio);

renderer.setSize(winWth, winHgt);

container.appendChild(renderer.domElement);

// 盘旋控制

var orbitControl = new THREE.OrbitControls(camera, renderer.domElement);

orbitControl.minDistrance = 20;

orbitControl.maxDistrance = 50;

orbitControl.maxPolarAngle = Math.PI/2;

// 性能测试

stats = new Stats();

container.appendChild(stats.dom);

// resize事件

window.addEventListener('resize', onWindowResize, false);

}

// 窗口大小改变

function onWindowResize() {

camera.aspect = window.innerWidth/window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize(window.innerWidth, window.innerHeight);

}

// 渲染

function render() {

group.rotation.y -= 0.0005;

renderer.render(scene, camera);

}

// 动画

function animate() {

requestAnimationFrame(animate);

render();

stats.update();

}

init();

animate();

完整代码:

web前端开发学习Q-q-u-n: 731771211,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频,PDF)

var log = console.log.bind(console);

var globeObj = (function() {

'use strict';

// 判断浏览器是否支持webgl

if(!Detector.webgl) Detector.addGetWebGLMessage();

var container, stats;

var camera, scene, renderer;

var group;

var mouseX = 0, mouseY = 0;

var winWth = window.innerWidth, winHgt = window.innerHeight;

// 获取position

function getPosition(lng, lat, alt) {

var phi = (90-lat)*(Math.PI/180),

theta = (lng+180)*(Math.PI/180),

radius = alt+200,

x = -(radius * Math.sin(phi) * Math.cos(theta)),

z = (radius * Math.sin(phi) * Math.sin(theta)),

y = (radius * Math.cos(phi));

return {x: x, y: y, z: z};

}

// 飞机

function plane() {

var socket = io('https://loc.variflight.com/*****此处接口地址不能给了', {transports: ['websocket']});

var clientBounds = [52.793056,72.427908,2.970897,135.181814];

// 连接

socket.on('connect', function() {

socket.emit("sub", clientBounds, -1, '', function(){});

});

// 飞机标记

var planeMarkers = {};

// 飞机形状

var planeShape = new THREE.Shape();

planeShape.moveTo( 0, 0);

planeShape.lineTo(0.2, -0.2);

planeShape.lineTo(0.2, -1.3);

planeShape.lineTo(1.6,-2.7);

planeShape.lineTo(1.6,-3);

planeShape.lineTo(0.2, -2.1);

planeShape.lineTo(0.2, -3);

planeShape.lineTo(0.5, -3.4);

planeShape.lineTo(0.5, -3.7);

planeShape.lineTo(0, -3.3);

planeShape.lineTo(-0.5, -3.7);

planeShape.lineTo(-0.5, -3.4);

planeShape.lineTo(-0.2, -3);

planeShape.lineTo(-0.2, -2.1);

planeShape.lineTo(-1.6,-3);

planeShape.lineTo(-1.6,-2.7);

planeShape.lineTo(-0.2, -1.3);

planeShape.lineTo(-0.2, -0.2);

var planeGeometry = new THREE.ShapeGeometry(planeShape);

// 飞机材质

var planeMaterial = new THREE.MeshPhongMaterial({color: 0x0FB4DD, side: THREE.DoubleSide, depthTest: true});

// 添加飞机

function addPlane(item) {

if(item.anum && item.lng && item.lat) {

var plane = new THREE.Mesh(planeGeometry, planeMaterial);

// 旋转

plane.rotation.z = THREE.Math.degToRad(item.ang);

// 定位

var position = getPosition(item.lng, item.lat, 5);

plane.position.set(position.x, position.y, position.z);

// 显示/隐藏

// plane.visible = false;

// 保存

planeMarkers[item.anum] = plane;

// 添加到场景

group.add(plane);

// 绘制历史轨迹

drawHistoryTrack(item.anum);

}

}

// 时间段

var curTime = Date.parse(new Date())/1000;

var depTime = curTime - 30*60;

// 轨迹线质

var trackMaterial = new THREE.LineBasicMaterial({color : 0x1B94B1});

// 绘制历史轨迹

function drawHistoryTrack(anum) {

socket.emit("fullPath", anum, depTime, curTime, function(status, data){

if(status) {

var dLength = data.length;

if(dLength>=2) {

var trackCoordArr = [];

for(var i=0; i

if(data[i].lng && data[i].alt) {

trackCoordArr.push({lng: data[i].lng, lat: data[i].lat});

}

}

var tcaLength = trackCoordArr.length;

if(tcaLength>=2) {

var tcaHalfLength = Math.ceil(tcaLength/2),

tcaRemainLength = tcaLength-tcaHalfLength,

vertexArr = [];

/* 所有点

for(var j=0; j

var p1 = getPosition(trackCoordArr[j].lng, trackCoordArr[j].lat, j*0.05);

vertexArr.push(new THREE.Vector3(p1.x, p1.y, p1.z));

}

for(var k=tcaRemainLength; k>0; k--) {

var p2 = getPosition(trackCoordArr[tcaLength-k].lng, trackCoordArr[tcaLength-k].lat, k*0.05);

vertexArr.push(new THREE.Vector3(p2.x, p2.y, p2.z));

}

var trackCurve = new THREE.CatmullRomCurve3(vertexArr);

*/

// 三个点

var p1 = getPosition(trackCoordArr[0].lng, trackCoordArr[0].lat, 0),

p2 = getPosition(trackCoordArr[tcaHalfLength].lng, trackCoordArr[tcaHalfLength].lat, tcaLength*0.01),

p3 = getPosition(trackCoordArr[tcaLength-1].lng, trackCoordArr[tcaLength-1].lat, 0);

var trackCurve = new THREE.CatmullRomCurve3([

new THREE.Vector3(p1.x, p1.y, p1.z),

new THREE.Vector3(p2.x, p2.y, p2.z),

new THREE.Vector3(p3.x, p3.y, p3.z)

]);

var trackGeometry = new THREE.Geometry(),

verticesArr = trackCurve.getPoints(tcaLength);

trackGeometry.vertices = verticesArr;

var trackLine = new THREE.Line(trackGeometry, trackMaterial);

group.add(trackLine);

// 动画点

addLightPoint(p1, tcaLength, verticesArr);

}

}

}

});

}

// 点动画

var pointGeometry = new THREE.SphereGeometry(0.2, 20, 20);

var pointMaterial = new THREE.MeshBasicMaterial({color: 0x40E0D0});

function addLightPoint(pos, coordsNum ,verArr) {

var pointMesh = new THREE.Mesh(pointGeometry, pointMaterial);

pointMesh.position.set(pos.x, pos.y, pos.z);

group.add(pointMesh);

var index = 0;

function pointAnimate() {

index++;

if(index>coordsNum) {

index = 0;

}

pointMesh.position.set(verArr[index].x, verArr[index].y, verArr[index].z);

requestAnimationFrame(pointAnimate);

}

pointAnimate();

/*var curveGeometry = new THREE.Geometry();

var curveData = new THREE.CatmullRomCurve3(verArr.slice(0, 10));

curveGeometry.vertices = curveData.getPoints(10);

var curveMaterial = new THREE.LineBasicMaterial({color: 0x40E0D0});

var curveLine = new THREE.Line(curveGeometry, curveMaterial);

group.add(curveLine);

var index = 0;

function lineAnimate() {

index++;

if(index>coordsNum-10) {

index = 0;

}

var offsetData = verArr.slice(index, 10+index);

if(offsetData.length > 0) {

curveData = new THREE.CatmullRomCurve3(offsetData);

curveLine.geometry.vertices = curveData.getPoints(10);

curveLine.geometry.verticesNeedUpdate = true;

}

requestAnimationFrame(lineAnimate);

}

lineAnimate();*/

}

// 监听数据(添加并更新)

socket.on('~', function(res) {

if($.isEmptyObject(planeMarkers)) {

$.each(res, function(i, item) {

addPlane(item);

});

} else {

$.each(res, function(i, item) {

if(planeMarkers[item.anum]) {

if(item.lng && item.lat) {

var pos = getPosition(item.lng, item.lat, 5);

planeMarkers[item.anum].position.set(pos.x, pos.y, pos.z);

}

} else {

addPlane(item);

}

});

}

});

}

// 地球

function globe() {

var globeTextureLoader = new THREE.TextureLoader();

globeTextureLoader.load('images/textures/earth.jpg', function (texture) {

var globeGgeometry = new THREE.SphereGeometry(200, 100, 100);

var globeMaterial = new THREE.MeshStandardMaterial({map: texture});

var globeMesh = new THREE.Mesh(globeGgeometry, globeMaterial);

group.add(globeMesh);

group.rotation.x = THREE.Math.degToRad(35);

group.rotation.y = THREE.Math.degToRad(170);

});

}

// 星点

function stars() {

var starsGeometry = new THREE.Geometry();

for (var i = 0; i < 2000; i ++) {

var starVector = new THREE.Vector3(

THREE.Math.randFloatSpread(2000),

THREE.Math.randFloatSpread(2000),

THREE.Math.randFloatSpread(2000)

);

starsGeometry.vertices.push(starVector);

}

var starsMaterial = new THREE.PointsMaterial({color: 0x888888})

var starsPoint = new THREE.Points(starsGeometry, starsMaterial);

group.add(starsPoint);

}

// 光

function lights() {

var hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x333333, 2);

hemisphereLight.position.x = 0;

hemisphereLight.position.y = 0;

hemisphereLight.position.z = -200;

group.add(hemisphereLight);

}

// 初始化

function init() {

container = document.getElementById('zh_globe_container');

scene = new THREE.Scene();

var bgTexture = new THREE.TextureLoader().load("images/textures/starfield.jpg");

scene.background = bgTexture;

camera = new THREE.PerspectiveCamera(50, winWth/winHgt, 1, 2000);

camera.up.x = 0;

camera.up.y = 1;

camera.up.z = 0;

camera.position.x = 0;

camera.position.y = 0;

camera.position.z = 400;

camera.lookAt(0,0,0);

group = new THREE.Group();

scene.add(group);

// 地球

globe();

// 飞机

plane();

// 星点

stars();

// 半球光

lights();

// 渲染器

renderer = new THREE.WebGLRenderer({antialias: true, preserveDrawingBuffer: true});

renderer.setPixelRatio(window.devicePixelRatio);

renderer.setSize(winWth, winHgt);

container.appendChild(renderer.domElement);

// 盘旋控制

var orbitControl = new THREE.OrbitControls(camera, renderer.domElement);

orbitControl.minDistrance = 20;

orbitControl.maxDistrance = 50;

orbitControl.maxPolarAngle = Math.PI/2;

// 性能测试

stats = new Stats();

container.appendChild(stats.dom);

// resize事件

window.addEventListener('resize', onWindowResize, false);

}

// 窗口大小改变

function onWindowResize() {

camera.aspect = window.innerWidth/window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize(window.innerWidth, window.innerHeight);

}

// 渲染

function render() {

group.rotation.y -= 0.0005;

renderer.render(scene, camera);

}

// 动画

function animate() {

requestAnimationFrame(animate);

render();

stats.update();

}

init();

animate();

})();

场景背景图

threejs 绘制球体_web前端入门到实战:threejs 绘制地球、飞机、轨迹相关推荐

  1. 前端实现炫酷动效_web前端入门到实战:使用CSS创建一个炫酷的球体动画效果

    一个纯CSS实现的球体动画效果: 经过研究上面的效果实现起来大致可以分为五个步骤,下面就来一一介绍. 1.使用Jade和SCSS生成一个圆圈 创建一个圆圈的第一步是生成所有组成圆圈的粒子.有了Jade ...

  2. display none 隐藏后怎么显示_web前端入门到实战:元素显示隐藏的9种思路

    我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴 ...

  3. css文字向右对齐_web前端入门到实战:css常用样式对文本的处理演练

    CSS文本属性可定义文本的外观,这是毫无疑问的,其次css可以通过以下属性改变文字的排版,比方说letter-spacing实现字符间距text-indent: 2em;完成首行缩进2字符word-s ...

  4. ajax局部刷新_web前端入门到实战:实现html页面自动刷新

    使用场景: 页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新) 一定时间之后跳转到指定页面(登录注册之类) 前端开发使用伪数据调试html页面( ...

  5. html设置样式不继承_web前端入门到实战:css的核心原理分为优先级原则与继承原则两大部分...

    css原理:1.优先原则=>后解析的内容会覆盖之前解析的内容(所谓解析就是读取的css样式)2.继承原则=>嵌套里面的标签拥有外部标签的某些样式,子元素可以继承父元素的属性 1>优先 ...

  6. angular ngoninit 刷新html页面_web前端入门到实战:实现html页面自动刷新

    使用场景: 页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新) 一定时间之后跳转到指定页面(登录注册之类) 前端开发使用伪数据调试html页面( ...

  7. css hover变成手_web前端入门到实战:彻底掌握css动画「transition」

    马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了 ...

  8. webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段

    这篇文章会记录我们平时常用到的 CSS 片段,使用这些 CSS 可以帮助我们解决许多实际项目问题中遇到的,墙裂建议点赞收藏再看,方便日后查找 清除浮动 浮动给我们的代码带来的麻烦,想必不需要多说,我们 ...

  9. css 高度塌陷_web前端入门到实战:CSS 负边距的行为表现

    CSS 中的负边距 margin 是可以设置为负值的,这会帮你实现靠近顶部/左边相邻元素的效果,或者实现靠近底部/右边相邻元素的效果. 先介绍下我们的测试元素:一个简单的包含三个段落的容器元素.注意, ...

最新文章

  1. Python 之 matplotlib (九)contours等高线
  2. 转载:Hyper-V管理器和SCVMM 2008 R2区别
  3. 酷Q 小i——添加应用
  4. Java 设计模式之策略模式
  5. 一道微软公司的面试题目的算法实现
  6. Java学习之String StringBuffer StringBuilder区别
  7. 你的数据也可以-三篇NAR的数据库
  8. 猜数字四个数字不重复C语言,c语言题 猜数字游戏
  9. 顺时针 vs 逆时针
  10. 枯燥的计算机组成原理课.....!!! 看来只能自己看书消化了...!!!
  11. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱体的形成动画演示方法...
  12. 新托业模拟考试感言—了解一下参加过托业考试前辈们的经验03
  13. 使用gtest做单元测试
  14. 让Mac文本编辑器成为HTML编辑器
  15. java net php_atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php...
  16. 豆瓣电影TOP250和书籍TOP250爬虫
  17. $happy-new(year[2006])
  18. 面向对象开发期末复习概述(四)
  19. python opencv resize函数_OpenCV尺寸调整函数resize
  20. 班主任工作总结中职计算机网络,中职计算机班班主任工作计划

热门文章

  1. 关于DICOM格式图像大小和后缀名
  2. 程序员、架构师、技术经理、技术总监和 CTO 都是干什么的?
  3. 创业公司公关和危机管理必读
  4. 使用google搜索引擎的技巧
  5. 《Android/OPhone 开发完全讲义》已出版,现提供源代码下载
  6. python中ndarray对象_NumPy - Ndarray 对象
  7. 【Spark NLP】第 11 章:词嵌入
  8. VMware Workstation 9上安装MAC OS X Lion 10.8图解
  9. 国考省考行测:数字推理题2
  10. iOS 图片处理方法(按比例缩放,指定宽度按比例缩放)