private void UserControl_Loaded(object sender, RoutedEventArgs e) { if (uc == null) { uc = new Earth(); uc.config.isShowDebugInfo = true; //在屏下方显示相机信息 uc.config.isDynShow = true; //根据相机视界动态显示图形对象,动态载入时,此属性必须为true uc.config.isDynLoad = true; grdMain.Children.Add(uc); uc.earthManager.earthpara.ArrowSpan = 1.5f; //控制潮流箭头密度 loadModel(); uc.camera.XRotationScale = 0.8; uc.MouseMove += new MouseEventHandler(uc_MouseMove); //tooltip示例 tooltiptimer.Interval = TimeSpan.FromMilliseconds(200); tooltiptimer.Tick += new EventHandler(tooltiptimer_Tick); //动态载入 bworker.DoWork += new DoWorkEventHandler(bworker_DoWork); bworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bworker_RunWorkerCompleted); bworker.WorkerSupportsCancellation = true; uc.VisualRangeChanged += new EventHandler(uc_VisualRangeChanged); Camera.ViewRange vr = uc.camera.curCamearaViewRange; oldminjd = vr.farLongitudeStart; oldmaxjd = vr.farLongitudeEnd; oldminwd = vr.latitudeStart; oldmaxwd = vr.latitudeEnd; olddictance = uc.camera.curCameraDistanceToGround; } }
void uc_VisualRangeChanged(object sender, EventArgs e) { //判断是否重载对象 Camera.ViewRange vr = uc.camera.curCamearaViewRange; bool isReload = false; if (Math.Abs(uc.camera.curCameraDistanceToGround - olddictance) / olddictance > 0.3) //当离地距离变化超过30%时,重载对象 { isReload = true; } else { float cjd = (vr.farLongitudeStart + vr.farLongitudeEnd) / 2; float cwd = (vr.latitudeStart + vr.latitudeEnd) / 2; if ( (cjd < oldminjd + 0.25 * (oldmaxjd - oldminjd)) || (cjd > oldminjd + 0.75 * (oldmaxjd - oldminjd)) || (cwd < oldminwd + 0.25 * (oldmaxwd - oldminwd)) || (cwd > oldminwd + 0.75 * (oldmaxwd - oldminwd)) ) //当中心点偏移超过范围的50%时,重载对象 { isReload = true; } } if (isReload) { //重置载入范围 float jdlen = vr.farLongitudeEnd - vr.farLongitudeStart; float wdlen = vr.latitudeEnd - vr.latitudeStart; oldminjd = vr.farLongitudeStart - 3 * jdlen; oldmaxjd = vr.farLongitudeEnd + 3 * jdlen; oldminwd = vr.latitudeStart - 3 * wdlen; oldmaxwd = vr.latitudeEnd + 3 * wdlen; olddictance = uc.camera.curCameraDistanceToGround * 0.8f; //后台方式重载 //while (bworker.IsBusy) // bworker.CancelAsync(); //bworker.RunWorkerAsync(); if (!bworker.IsBusy) { bworker.RunWorkerAsync(); } } else //若不用重载对象,也需重绘对象 { if (!bworker.IsBusy) { uc.UpdateModel(); } } }