|
bota :
地图上汽车图标想根据行驶方向进行旋转?怎么做呢??????????
shellchan :
Feature好象没有Rotate方法 我个人觉得你可以用这个方法,其他的我也帮不了了。 Feature.Replace(ftr);ftr为旋转的车图,来改变方向? 不知你的意见如何?
bota :
shellchan的方法不是很好
可以用汽车字体的方法,可是有个问题,怎么能扩展汽车字体的内容呢。
我想找个箭头可找不到,想找个车头朝左和朝右各一张,也找不到。
谁有什么方法吗?
bota :
字体文件好象可以注册,有谁知道怎么注册吗?
shellchan :
用第三方的图片编辑一下,保存到图库中嘛。
自己要辛苦一下了,毕竟是为自己嘛。
加油!
不过我要学习你的方法,我查询了一下,好象Text有Rotate,但bitmap怎么能旋转呢?
只能是Text旋转啊?等待你的好消息!
许大马棒:
这个需要对图像进行旋转变换,就是乘以一个旋转矩阵。否则汽车的角度那么多,你用图片怎么弄得过来?
bota :
用图片不能进行旋转是不行的,只能通过注册字体文件来实现旋转。可是我不知道怎么注册字体文件?
zhangly :
网上的例子 void __fastcall TMainFrm::SpeedButton2Click(TObject *Sender) { // Set active tool to be vehicle plotting tool Map1->CurrentTool = PLOT_VEHICLE_TOOL; } //--------------------------------------------------------------------------- void __fastcall TMainFrm::SpeedButton7Click(TObject *Sender) { Map1->CurrentTool = miZoomInTool; } //--------------------------------------------------------------------------- void __fastcall TMainFrm::SpeedButton8Click(TObject *Sender) { Map1->CurrentTool = miZoomOutTool; } //--------------------------------------------------------------------------- void __fastcall TMainFrm::SpeedButton9Click(TObject *Sender) { // Display MapX stock layer control dialog Map1->Layers->LayersDlg(EmptyParam,EmptyParam); } //--------------------------------------------------------------------------- void __fastcall TMainFrm::Map1ToolUsed(TObject *Sender, short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, VARIANT_BOOL Shift, VARIANT_BOOL Ctrl, VARIANT_BOOL *EnableDefault) { CMapXFeature *fNewSymbol; CMapXFeature *fMapSymbol; CMapXPointDisp pt; CMapXStyleDisp style; Variant st; switch(ToolNum) { case PLOT_VEHICLE_TOOL: { pt.Bind(StringToOleStr("MapX.Point.5")); pt->Set_(X1,Y1); style.Bind(StringToOleStr("MapX.Style.5")); style=Map1->DefaultStyle->Clone(); style.set_SymbolBitmapTransparent(true); fNewSymbol = NULL; fNewSymbol = Map1->FeatureFactory->CreateSymbol(EmptyParam,EmptyParam); if(fNewSymbol!=NULL) { fNewSymbol->set_Point(pt); fNewSymbol->set_Style(style); if(lyrMyLayer!=NULL) { fMapSymbol=lyrMyLayer->AddFeature(fNewSymbol); if(fMapSymbol!=NULL) { fArray[iVehicleCount].fFeature = fMapSymbol; fArray[iVehicleCount].fStyle = fMapSymbol->Style->Clone(); fArray[iVehicleCount].iSpeed = 50; fArray[iVehicleCount].dHeading = 0; fArray[iVehicleCount].sName = "车辆"+IntToStr(iVehicleCount); fArray[iVehicleCount].sText =""; iVehicleCount++; updateListCars(); if (lstCars->Items->Count>0) { lstCars->ItemIndex=lstCars->Items->Count-1; lstCarsClick(NULL); } }//if(fMapSymbol!=NULL) }//if(lyrMyLayer!=NULL) }//if(fNewSymbol!=NULL) break; } case miZoomInTool: { Label4->Caption=FloatToStr(Map1->Zoom); // if(Map1->Zoom<=0.4) // Map1->ZoomTo(0.75,Map1->CenterX,Map1->CenterY); break; } case miZoomOutTool: { Label4->Caption=FloatToStr(Map1->Zoom); // if (Map1->Zoom>47.6871569161022) // Map1->ZoomTo(47.6871569161022,Map1->CenterX,Map1->CenterY); break; } } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::lstCarsClick(TObject *Sender) { iCarNum = lstCars->ItemIndex; txtVehicleName->Enabled = true; txtVehicleHeading->Enabled = true; txtVehicleSpeed->Enabled = true; txtVehicleName->Text = fArray[iCarNum].sName; txtVehicleSpeed->Text = fArray[iCarNum].iSpeed; txtVehicleHeading->Text = fArray[iCarNum].dHeading; } //--------------------------------------------------------------------------- void __fastcall TMainFrm::txtVehicleNameChange(TObject *Sender) { // If vehicle name is changed, update the feature fArray[iCarNum].sName = txtVehicleName->Text; fArray[iCarNum].fFeature->Keyvalue = StringToOleStr(txtVehicleName->Text); fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam); updateListCars(); } //--------------------------------------------------------------------------- void __fastcall TMainFrm::txtVehicleHeadingChange(TObject *Sender) { //角度变化 if(txtVehicleHeading->Text!="") { fArray[iCarNum].dHeading = StrToFloat(txtVehicleHeading->Text); fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam); } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::txtVehicleSpeedChange(TObject *Sender) { //速度变化 if(txtVehicleSpeed->Text!="") { fArray[iCarNum].iSpeed = StrToInt(txtVehicleSpeed->Text); fArray[iCarNum].fFeature->_Update(Variant(true),EmptyParam); } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::Timer1Timer(TObject *Sender) { double dYcomp, dXcomp, dYpos, dXpos; double dX,dY; int iCount; CMapXFeaturesPtr ftrs; CMapXPointDisp pt; /* if ft.Style.SymbolBitmapSize=20 then ft.Style.SymbolBitmapSize:=15 else ft.Style.SymbolBitmapSize:=20; ft.Update(EmptyParam, EmptyParam); */ for(iCount=0;iCount<iVehicleCount;iCount++) { if(fArray[iCount].iSpeed!=0) { dYcomp = fArray[iCount].iSpeed *1.852* sin(fArray[iCount].dHeading * 3.14159 / 180); dXcomp = fArray[iCount].iSpeed *1.852* cos(fArray[iCount].dHeading * 3.14159 / 180); dYpos = fArray[iCount].fFeature->CenterY + (1.0/69 * dYcomp * Timer1->Interval / 1000 * 1 /3600); dXpos = fArray[iCount].fFeature->CenterX + (1.0/55 * dXcomp * Timer1->Interval / 1000 * 1 /3600); fArray[iCount].fFeature->set_Style(fArray[iCount].fStyle); fArray[iCount].fFeature->Point->Set_(dXpos, dYpos); fArray[iCount].fFeature->_Update(Variant(true),EmptyParam); if (CheckBox1->Checked) { dX=fArray[lstCars->ItemIndex].fFeature->Point->get_X(); dY=fArray[lstCars->ItemIndex].fFeature->Point->get_Y(); Map1->ZoomTo(2.26351132841159,dX,dY); } else { Map1->Zoom=4.52700000000001; } if (lyrcztd!=NULL) { pt.Bind(StringToOleStr("MapX.Point.5")); pt->Set_(dXpos,dYpos); ftrs=lyrcztd->SearchWithinDistance(pt,300,miUnitMeter,miSearchTypeCentroidWithin);//miSearchTypePartiallyWithin); if (ftrs->Count>0) { if (fArray[iCount].fStyle.SymbolBitmapSize==24) { fArray[iCount].fStyle.SymbolBitmapSize=15; } else { fArray[iCount].fStyle.SymbolBitmapSize=24; } fArray[iCount].fFeature->_Update(Variant(true),EmptyParam); fArray[iCount].sText ="危险!!!小车在坐标("+FloatToStr(dXpos)+","+FloatToStr(dYpos)+")发现障碍物 "+IntToStr(ftrs->Count)+"个!"; if ((FileExists(MediaPlayer1->FileName)) && (CheckBox2->Checked) &&((fArray[lstCars->ItemIndex].sText).SubString(0,4)=="危险")) { MediaPlayer1->Close(); MediaPlayer1->Open(); MediaPlayer1->Play(); } } else { fArray[iCount].fStyle.SymbolBitmapSize=24; fArray[iCount].fFeature->_Update(Variant(true),EmptyParam); fArray[iCount].sText ="小车在坐标("+FloatToStr(dXpos)+","+FloatToStr(dYpos)+")没有遇到建筑物,可以安全通过!"; } if (Panel2->Visible==false) Panel2->Visible=true; Label4->Caption=fArray[lstCars->ItemIndex].sText; } } } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::SpeedButton10Click(TObject *Sender) { Map1->CurrentTool = miArrowTool; } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N1Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_right.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="0"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N2Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_left.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="180"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N3Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_up.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="90"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N4Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_down.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="-90"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N5Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_upleft.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="125"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N6Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_upright.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="45"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N7Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_downleft.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="-125"; } } //--------------------------------------------------------------------------- void __fastcall TMainFrm::N8Click(TObject *Sender) { String strCar; int iIndex; CMapXFeature *ftr; CMapXStyleDisp style; if (lstCars->Items->Count>0) { iIndex=lstCars->ItemIndex; strCar=lstCars->Items->Strings[iIndex]; ftr=fArray[iIndex].fFeature; style.Bind(StringToOleStr("MapX.Style.5")); style=ftr->Style->Clone(); style.set_SymbolBitmapName(Variant("car_downright.bmp")); ftr->set_Style(style); fArray[iIndex].fStyle=style.Clone(); ftr->_Update(Variant(true),EmptyParam); txtVehicleHeading->Text="-45"; } }
wenzi19xx :
简单啊,先用create-font之类的字体制作软件绘制汽车形状的字体,软后将该字体放入windows/font目录下(这样会自动注册字体的),然后旋转字体就行了嘛:)
wenzi19xx :
楼上的有作导航的吗?导航中用到的各种提示信息各位都是用什么方法显示的?比如罗盘啊,指南针啊,文字信息啊,直接在图层上画是不是太慢了?
ldd2w :
引用别人的: 如果系统中没有合适的TrueType字体的话 就需要自己编辑,然后注册,再进行使用,要用到的几个软件有 1 FontShow (用于查看字体) 2 Font Creator (用于编辑字体,我用这个软件画了一个箭头图标) 3 Font Wrangler(用于注册字体,注意,字体分为文件名和注册名,别弄错了) 以上例子中的MyCarFont8就是我自己编辑的字体文件,呵呵(试验了8次才试通) 字体文件是一个库,里面可以有很多个字体图片,通过这个语句 SymbolCharacter = 80 来选择你想要的字体图片,80就是图片的序号,可以在FontShow这个软件里面查到 表现车辆的行驶方向有两种方法: 1 直接旋转,就是说,在一个图片的基础上,旋转不同的角度,有个不好就是自动标注 有可能会影响表现的效果 2 不同方向不同图片(我就是用这个方法),定义8个方向,配合8张图片,根据车辆的实际 方向,调用不同字体图片 大概经验就这么多啦,还有一种方法就是调用系统API直接将车辆图标画在屏幕上并旋转 |