使用R语言中的`line.color`参数来指定配对数据连接线的颜色

100 篇文章 ¥59.90 ¥99.00
本文介绍了在R语言中如何使用`line.color`参数指定配对数据连接线的颜色,以增强信息可视化的效果。通过示例代码展示了如何在散点图和其他绘图函数中应用该参数,以自定义连接线的颜色,提升图表的可读性。

使用R语言中的line.color参数来指定配对数据连接线的颜色

在R语言中,绘制数据可视化图表时,我们经常需要将不同的数据点通过连线来表示它们之间的关系。line.color参数提供了一种简单的方式来指定配对数据连接线的颜色。在本文中,我们将详细介绍如何使用line.color参数,并提供相应的源代码示例。

首先,让我们创建一些示例数据来进行可视化。假设我们有两个变量x和y,它们之间存在某种关系。我们可以使用以下代码生成一些随机的x和y值:

set.seed(123)  # 设置随机数种子,以确保结果可重现
x <- rnorm(10)  # 生成10个随机的x值
y <- x + rnorm(10)  # 生成对应的y值,其中包含随机噪声

接下来,我们可以使用plot()函数创建一个散点图,并使用line.color参数来指定配对数据连接线的颜色。以下是示例代码:

plot(x, y, pch = 16, col = "blue", xlim = c(min(x, y), max(x, y)), ylim = c(min(x, y), max(x, y)), xlab = "x", ylab = "y", main = "配对数据连接线示例", line.color = "red")

上述代码中,我们传递了line.color = "red"

分析这段代码if (iterr->first.Find(L"桥架") > -1) { dmtl.extractCurveInfos(iterr->second, vCurves, nCountOfCurves, false); vector<DwgElecCableTray> m_CableTray; vector<DwgElecCableTrayElbow> mCableTrayElbow; vector<DwgElecCableTray3T> mCableTrayElbow3T; vector<DwgElecCableTray4T> mCableTrayElbow4T; //用于寻找连接关系的所有线段的集合 vector<geoSegLine> vAllSegLines; //找到当前集合中所有与设备相连接的线段 vector<qCadDbObjectPtr> vObjs; for (auto id : iterr->second) { qCadDbObjectPtr obj = id.openObject(); vObjs.push_back(obj); } //排除不属于判断标准的管线 map<int, std::vector<std::pair<qCadDbObjectId, geoCurve*>>> mTraysValid, mTraysInValid; int nCountValid = 0, nCountInValid = 0; for (auto x : vCurves) { std::vector<std::pair<qCadDbObjectId, geoCurve*>> vTemp; vTemp = searchAllConnectedLineWW(x.second, x.first, vCurves); if (vTemp.size() > 2) { mTraysValid[nCountValid++] = vTemp; } else { mTraysInValid[nCountInValid] = vTemp; } } vector<pair<qCadDbObjectId, geoSegLine>> vCableTrays; map<qCadDbObjectId, geoSegLine> mCableTrays; for (auto iterLine = mTraysValid.begin(); iterLine != mTraysValid.end(); iterLine++) { vector<pair<qCadDbObjectId, geoCurve *>> vCT; vCT = iterLine->second; for (auto temp : vCT) { qCadDbObjectPtr pObj = temp.first.openObject(); qCadDbObjectId pId = temp.first; if (!pObj) continue; qCadDbEntityPtr pEnt = qCadDbEntity::cast(pObj); if (!pEnt) continue; if (pEnt->visibility() == qCadDb::qInvisible) continue; //折线数据提取 if (pObj->isKindOf(qCadDbPolyline::desc())) { geoSegLine tempLine; DwgElecConduit conduit; qCadDbPolylinePtr pBlkPloy = qCadDbPolyline::cast(pObj); geoPoint3d firstP, lastP; int size = pBlkPloy->numVerts(); pBlkPloy->getPointAt(0, firstP); pBlkPloy->getPointAt(size - 1, lastP); tempLine.Set(firstP, lastP); tempLine.setState(0); vCableTrays.push_back(make_pair(pId, tempLine)); mCableTrays[pId] = tempLine; } //直线数据提取 else if (pObj->isKindOf(qCadDbLine::desc())) { geoSegLine tempLine; DwgElecConduit conduitForLine; qCadDbLinePtr pBlkLine = qCadDbLine::cast(pObj); geoPoint3d firstP, lastP; pBlkLine->getStartPoint(firstP); pBlkLine->getEndPoint(lastP); tempLine.Set(firstP, lastP); tempLine.setState(0); vCableTrays.push_back(make_pair(pId, tempLine)); mCableTrays[pId] = tempLine; } //弧线数据提取 else if (pObj->isKindOf(qCadDbArc::desc())) { geoSegLine tempLine; DwgElecConduit conduitArc; qCadDbArcPtr pBlkArc = qCadDbArc::cast(pObj); geoPoint3d firstP, lastP; pBlkArc->getStartPoint(firstP); pBlkArc->getEndPoint(lastP); tempLine.Set(firstP, lastP); tempLine.setState(0); vCableTrays.push_back(make_pair(pId, tempLine)); mCableTrays[pId] = tempLine; } } } //分析所有的双线桥架对应关系 for (auto lineI : vCableTrays) { //判断两条线是否平行与是否为最近距离线段 vector<pair<double, qCadDbObjectId>> vElecData; for (auto lineII : vCableTrays) { if (lineI.second.IsParallelTo(lineII.second) && lineI.second.lenth() >= lineII.second.lenth() - 300 && lineI.second.lenth() <= lineII.second.lenth() + 300) { geoPoint3d startP, endP, startPerp, endPerp; double startDistt = 0, endDistt = 0; startP = lineI.second.startPoint(); endP = lineI.second.endPoint(); lineII.second.GetPerpPt(startP, startPerp); lineII.second.GetPerpPt(endP, endPerp); startDistt = startP.DistanceTo(startPerp); endDistt = endP.DistanceTo(endPerp); //确认垂足数量 0 为没有交集 if (startDistt > endDistt && endDistt != 0) { for (auto num : m_CableTraySize) { if ((abs(num - endDistt) < 1) && (abs(lineI.second.lenth() - lineII.second.lenth()) < 10)) { vElecData.push_back(make_pair(endDistt, lineII.first)); } } } else if (startDistt <= endDistt && startDistt != 0) { for (auto num : m_CableTraySize) { if ((abs(num - startDistt) < 1) && (abs(lineI.second.lenth() - lineII.second.lenth()) < 10)) { vElecData.push_back(make_pair(startDistt, lineII.first)); } } } } } if (vElecData.size() == 0) continue; sort(vElecData.begin(), vElecData.end(), FindSmallestNum); DwgElecCableTray tray; tray.m_CableTray1ID = lineI.first; tray.m_CableTrayLine1 = lineI.second; tray.m_CableTray2ID = vElecData[0].second; tray.m_CableTrayLine2 = mCableTrays[vElecData[0].second]; tray.m_CableTrayRadius = vElecData[0].first / 2; tray.m_systemName = iterr->first; m_CableTray.push_back(tray); } //删除重复的数据 vector<DwgElecCableTray> vStoredData; for (int i = 0; i < m_CableTray.size(); i++) { bool passOrNot = true; if (!vStoredData.empty()) { for (int j = 0; j < vStoredData.size(); j++) { CString id1LineOne, id1LineTwo, id2LineOne, id2LineTwo; id1LineOne = GetDuctLineId(m_CableTray[i].m_CableTray1ID); id1LineTwo = GetDuctLineId(m_CableTray[i].m_CableTray2ID); id2LineOne = GetDuctLineId(vStoredData[j].m_CableTray1ID); id2LineTwo = GetDuctLineId(vStoredData[j].m_CableTray2ID); if ((id1LineOne == id2LineOne && id1LineTwo == id2LineTwo) || (id1LineOne == id2LineTwo && id1LineTwo == id2LineOne) && m_CableTray[i].m_CableTrayCenterLine.lenth() == vStoredData[j].m_CableTrayCenterLine.lenth()) { passOrNot = false; break; } } } if (passOrNot == true) { vStoredData.push_back(m_CableTray[i]); } } if (!vStoredData.empty()) { m_CableTray.clear(); m_CableTray = vStoredData; } vStoredData.clear(); //找到符合模数和长度的桥架 for (auto iterC = m_CableTray.begin(); iterC != m_CableTray.end(); iterC++) { geoPoint3d perPt1, perPt2, perPt3, perPt4; vector<pair<geoPoint3d, geoPoint3d>> perPoints; vector<geoPoint3d> pointsOnLine; //找到两条线的每一条垂足 if (iterC->m_CableTrayLine2.GetPerpPt(iterC->m_CableTrayLine1.startPoint(), perPt1) == 0) { perPoints.push_back(make_pair(perPt1, iterC->m_CableTrayLine1.startPoint())); } if (iterC->m_CableTrayLine2.GetPerpPt(iterC->m_CableTrayLine1.endPoint(), perPt2) == 0) { perPoints.push_back(make_pair(perPt2, iterC->m_CableTrayLine1.endPoint())); } if (iterC->m_CableTrayLine1.GetPerpPt(iterC->m_CableTrayLine2.startPoint(), perPt3) == 0) { perPoints.push_back(make_pair(perPt3, iterC->m_CableTrayLine2.startPoint())); } if (iterC->m_CableTrayLine1.GetPerpPt(iterC->m_CableTrayLine2.endPoint(), perPt4) == 0) { perPoints.push_back(make_pair(perPt4, iterC->m_CableTrayLine2.endPoint())); } if (perPoints.size() == 4) { geoPoint3d startPt, endPt; geoSegLine centerLine; double distanceOfTwoLines; if (iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint()) > iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint())) { startPt.x = (iterC->m_CableTrayLine1.startPoint().x + iterC->m_CableTrayLine2.endPoint().x) / 2; startPt.y = (iterC->m_CableTrayLine1.startPoint().y + iterC->m_CableTrayLine2.endPoint().y) / 2; endPt.x = (iterC->m_CableTrayLine1.endPoint().x + iterC->m_CableTrayLine2.startPoint().x) / 2; endPt.y = (iterC->m_CableTrayLine1.endPoint().y + iterC->m_CableTrayLine2.startPoint().y) / 2; distanceOfTwoLines = iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint()); } else if (iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint()) < iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint())) { startPt.x = (iterC->m_CableTrayLine1.startPoint().x + iterC->m_CableTrayLine2.startPoint().x) / 2; startPt.y = (iterC->m_CableTrayLine1.startPoint().y + iterC->m_CableTrayLine2.startPoint().y) / 2; endPt.x = (iterC->m_CableTrayLine1.endPoint().x + iterC->m_CableTrayLine2.endPoint().x) / 2; endPt.y = (iterC->m_CableTrayLine1.endPoint().y + iterC->m_CableTrayLine2.endPoint().y) / 2; distanceOfTwoLines = iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint()); } centerLine.Set(startPt, endPt); //if (distanceOfTwoLines > iterC->m_CableTrayLine1.lenth()) //{ // continue; //} iterC->m_CableTrayCenterLine = centerLine; iterC->m_CableTrayId = GetDuctLineId(iterC->m_CableTray1ID) + L"#" + GetDuctLineId(iterC->m_CableTray2ID); vStoredData.push_back(*iterC); } } // m_CableTray.clear(); // m_CableTray = vStoredData; // vStoredData.clear(); // //查找所有复合模数但不是桥架的线配对 // for (auto nonCableTray : m_CableTray) // { // if (nonCableTray.m_CableTrayLine1.startPoint().DistanceTo(nonCableTray.m_CableTrayLine2.startPoint()) <= nonCableTray.m_CableTrueRange.lenth()) // { // vStoredData.push_back(nonCableTray); // } // } m_CableTray.clear(); m_CableTray = vStoredData; vStoredData.clear(); //在所有选中线中寻找符合弯头的形状 并将所有弯头编号 map<int, DwgElecCableTrayElbow> vElbows; int nCount = 0; for (auto line : vCableTrays) { DwgElecCableTrayElbow elbow; vector<pair<geoPoint3d, pair<qCadDbObjectId, geoSegLine>>> vStartTray; vector<pair<geoPoint3d, pair<qCadDbObjectId, geoSegLine>>> vEndTray; for (auto lineConect : vCableTrays) { if (lineConect.first != line.first) { if (line.second.startPoint().DistanceTo(lineConect.second.startPoint()) < 10) { geoVector2d v1(lineConect.second.endPoint().x - lineConect.second.startPoint().x, lineConect.second.endPoint().y - lineConect.second.startPoint().y); geoVector2d v2(line.second.endPoint().x - line.second.startPoint().x, line.second.endPoint().y - line.second.startPoint().y); if (LineIsPerpAt(v1, v2)) { vStartTray.push_back(make_pair(lineConect.second.endPoint(), lineConect)); } } if (line.second.startPoint().DistanceTo(lineConect.second.endPoint()) < 10) { geoVector2d v1(lineConect.second.startPoint().x - lineConect.second.endPoint().x, lineConect.second.startPoint().y - lineConect.second.endPoint().y); geoVector2d v2(line.second.endPoint().x - line.second.startPoint().x, line.second.endPoint().y - line.second.startPoint().y); if (LineIsPerpAt(v1, v2)) { vStartTray.push_back(make_pair(lineConect.second.startPoint(), lineConect)); } } if (line.second.endPoint().DistanceTo(lineConect.second.startPoint()) < 10) { geoVector2d v1(lineConect.second.endPoint().x - lineConect.second.startPoint().x, lineConect.second.endPoint().y - lineConect.second.startPoint().y); geoVector2d v2(line.second.startPoint().x - line.second.endPoint().x, line.second.startPoint().y - line.second.endPoint().y); if (LineIsPerpAt(v1, v2)) { vEndTray.push_back(make_pair(lineConect.second.endPoint(), lineConect)); } } if (line.second.endPoint().DistanceTo(lineConect.second.endPoint()) < 10) { geoVector2d v1(lineConect.second.startPoint().x - lineConect.second.endPoint().x, lineConect.second.startPoint().y - lineConect.second.endPoint().y); geoVector2d v2(line.second.startPoint().x - line.second.endPoint().x, line.second.startPoint().y - line.second.endPoint().y); if (LineIsPerpAt(v1, v2)) { vEndTray.push_back(make_pair(lineConect.second.startPoint(), lineConect)); } } } } if (vStartTray.size() >= 1 && vEndTray.size() >= 1) { elbow.connectLine1 = vStartTray[0].second.first; elbow.connectLine2 = vEndTray[0].second.first; elbow.startLine = vStartTray[0].second.second; elbow.startPoint = vStartTray[0].first; elbow.endLine = vEndTray[0].second.second; elbow.endPoint = vEndTray[0].first; vElbows[nCount++] = elbow; //测试弯头识别是否成功 //qCadDbLinePtr pLine = qCadDbLine::createObject(); //pLine->setStartPoint(elbow.startPoint); //pLine->setEndPoint(elbow.endPoint); //qCadCmColor color; //color.setRGB(225, 107, 162); //水粉色 //pLine->setColorIndex(6); //洋红色 //qCadDbObjectId objId; //objId = qCadInterfaceMgr::CreateNewEntity(pLine); } } //排除桥架与弯头的重叠处(一小段弯头被识别为桥架) vector<DwgElecCableTray> vNewCableTray; for (auto duplicateTray : m_CableTray) { bool bDuplicateTray = false; for (auto dElbow : vElbows) { if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10 && duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10 && duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10 && duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10 && duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10 && duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10 && duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10 && duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10) { bDuplicateTray = true; } else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10 && duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10) { bDuplicateTray = true; } } if (!bDuplicateTray) { vNewCableTray.push_back(duplicateTray); } } m_CableTray.clear(); m_CableTray = vNewCableTray; //生成写出id for (auto ids : m_CableTray) { ids.m_CableTrayId = GetDuctLineId(ids.m_CableTray1ID) + L"#" + GetDuctLineId(ids.m_CableTray2ID); DwgElecCableTray tempId; tempId.m_CableTrayCenterLine = ids.m_CableTrayCenterLine; tempId.m_CableTrayId = ids.m_CableTrayId; tempId.m_CableTrayRadius = ids.m_CableTrayRadius; tempId.m_systemName = ids.m_systemName; mElecDataSet[iter->first].m_ElecCableTrays.push_back(tempId); } //寻找变径 //寻找两根符合要求的线 vector<std::pair<geoSegLine, geoSegLine>> vFitLines; for (auto temp : vCableTrays) { for (auto line : vCableTrays) { //不是同一条线且不平行 if (temp.first != line.first && !temp.second.IsParallelTo(line.second) && temp.second.AngleTo(line.second) > 0 && temp.second.AngleTo(line.second) < qCad_PI / 2.0 && !temp.second.IsInersectWith2d(line.second, 10)) { vFitLines.push_back(make_pair(temp.second, line.second)); } } } //寻找与这两条线相连接的桥架 vector<DwgElecCableTrayReducing> vCTReducings; //for (auto CT1 : m_CableTray) //{ // for (auto CT2 : m_CableTray) // { // if (CT1.second.startPoint().DistanceTo(matchCT.m_CableTrayLine1.startPoint()) < 25) // { // } // else if (CT1.second.startPoint().DistanceTo(matchCT.m_CableTrayLine1.endPoint()) < 25) // { // } // if (CT1.second.endPoint().DistanceTo(matchCT.m_CableTrayLine1.startPoint()) < 25) // { // } // else if (CT1.second.endPoint().DistanceTo(matchCT.m_CableTrayLine1.endPoint()) < 25) // { // } // } //} //通过弯头找到相连接的桥架 //判断弯头所在构件的完整类型 1 弯头 2 三通 3 四通 for (auto iterE = vElbows.begin(); iterE != vElbows.end(); iterE++) { if (iterE->second.ischecked) continue; vector<DwgElecCableTrayElbow> cableTrayCount; cableTrayCount.push_back(iterE->second); iterE->second.ischecked = true; DwgElecCableTray cableTrayConnect1, cableTrayConnect2; vector<pair<double, DwgElecCableTray>> vClosetCableTrayS, vClosetCableTrayE; vector<DwgElecCableTray> vClosetCableTS, vClosetCableTE; for (auto centerLine : m_CableTray) { //与弯头的起点线平行 if (centerLine.m_CableTrayCenterLine.IsParallelTo(iterE->second.startLine)) { geoPoint3d intersectP; if (centerLine.m_CableTrayLine1.IntersectWith(iterE->second.startLine, intersectP, 20)) { vClosetCableTS.push_back(centerLine); } else if (centerLine.m_CableTrayLine2.IntersectWith(iterE->second.startLine, intersectP, 20)) { vClosetCableTS.push_back(centerLine); } double distS = centerLine.m_CableTrayCenterLine.startPoint().DistanceTo(iterE->second.startPoint); double distE = centerLine.m_CableTrayCenterLine.endPoint().DistanceTo(iterE->second.startPoint); if (distS > distE && distE <= 400) { vClosetCableTrayS.push_back(make_pair(distE, centerLine)); } else if (distS < distE && distS <= 400) { vClosetCableTrayS.push_back(make_pair(distS, centerLine)); } } //与弯头终点线平行 if (centerLine.m_CableTrayCenterLine.IsParallelWith(iterE->second.endLine)) { geoPoint3d intersectP; if (centerLine.m_CableTrayLine1.IntersectWith(iterE->second.endLine, intersectP, 20)) { vClosetCableTE.push_back(centerLine); } else if (centerLine.m_CableTrayLine2.IntersectWith(iterE->second.endLine, intersectP, 20)) { vClosetCableTE.push_back(centerLine); } double distS = centerLine.m_CableTrayCenterLine.startPoint().DistanceTo(iterE->second.endPoint); double distE = centerLine.m_CableTrayCenterLine.endPoint().DistanceTo(iterE->second.endPoint); if (distS > distE && distE <= 400) { vClosetCableTrayE.push_back(make_pair(distE, centerLine)); } else if (distS < distE && distS <= 400) { vClosetCableTrayE.push_back(make_pair(distS, centerLine)); } } } if (vClosetCableTrayS.size() > 0) { sort(vClosetCableTrayS.begin(), vClosetCableTrayS.end(), FindClosetNum); cableTrayConnect1 = vClosetCableTrayS[0].second; } if (vClosetCableTrayE.size() > 0) { sort(vClosetCableTrayE.begin(), vClosetCableTrayE.end(), FindClosetNum); cableTrayConnect2 = vClosetCableTrayE[0].second; } //找到桥架另一端是否还有其他弯头 vector<pair<double, DwgElecCableTrayElbow>> vClosetCableTrayElow1, vClosetCableTrayElow2; for (auto iterF = vElbows.begin(); iterF != vElbows.end(); iterF++) { if (iterF->first != iterE->first && iterF->second.ischecked == false) { if (iterF->second.startLine.IsParallelWith(cableTrayConnect1.m_CableTrayCenterLine)) { double dist = iterF->second.startPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.startPoint()); double distOther = iterF->second.startPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.endPoint()); double distElbows1 = iterF->second.startPoint.DistanceTo(iterE->second.startPoint); double distElbows2 = iterF->second.startPoint.DistanceTo(iterE->second.endPoint); if (dist < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(dist, iterF->second)); } else if (distOther < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second)); } } if (iterF->second.endLine.IsParallelWith(cableTrayConnect1.m_CableTrayCenterLine)) { double dist = iterF->second.endPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.startPoint()); double distOther = iterF->second.endPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.endPoint()); double distElbows1 = iterF->second.endPoint.DistanceTo(iterE->second.startPoint); double distElbows2 = iterF->second.endPoint.DistanceTo(iterE->second.endPoint); if (dist < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(dist, iterF->second)); } else if (distOther < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second)); } } if (iterF->second.startLine.IsParallelWith(cableTrayConnect2.m_CableTrayCenterLine)) { double dist = iterF->second.startPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.startPoint()); double distOther = iterF->second.startPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.endPoint()); double distElbows1 = iterF->second.startPoint.DistanceTo(iterE->second.startPoint); double distElbows2 = iterF->second.startPoint.DistanceTo(iterE->second.endPoint); if (dist < 400 && (distElbows1 <= cableTrayConnect2.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect2.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow2.push_back(make_pair(dist, iterF->second)); } else if (distOther < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second)); } } if (iterF->second.endLine.IsParallelWith(cableTrayConnect2.m_CableTrayCenterLine)) { double dist = iterF->second.endPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.startPoint()); double distOther = iterF->second.endPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.endPoint()); double distElbows1 = iterF->second.endPoint.DistanceTo(iterE->second.startPoint); double distElbows2 = iterF->second.endPoint.DistanceTo(iterE->second.endPoint); if (dist < 400 && (distElbows1 <= cableTrayConnect2.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect2.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow2.push_back(make_pair(dist, iterF->second)); } else if (distOther < 400 && (distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 || distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2)) { iterF->second.ischecked = true; vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second)); } } } } if (vClosetCableTrayElow1.size() > 0) { sort(vClosetCableTrayElow1.begin(), vClosetCableTrayElow1.end(), FindClostNum); cableTrayCount.push_back(vClosetCableTrayElow1[0].second); } if (vClosetCableTrayElow2.size() > 0) { sort(vClosetCableTrayElow2.begin(), vClosetCableTrayElow2.end(), FindClostNum); cableTrayCount.push_back(vClosetCableTrayElow2[0].second); } //MepBaseAPI mepBaseAPI; //一边都没有 弯头 if (cableTrayCount.size() == 1) { CString str = dmtl.NewGuid(); DwgElecCableTrayElbow elbow; elbow.m_ElbowObjID = str; elbow.m_ConnectLineObjID1 = cableTrayConnect1.m_CableTrayId; elbow.m_ConnectLineObjID2 = cableTrayConnect2.m_CableTrayId; mElecDataSet[iter->first].m_ElecCableTrayElows.push_back(elbow); } //有一边有弯头 三通 else if (cableTrayCount.size() == 2) { CString str = dmtl.NewGuid(); DwgElecCableTray3T CableTray3T; CableTray3T.m_CableTray3TID = str; CableTray3T.m_CableTray1 = cableTrayConnect1.m_CableTrayId; CableTray3T.m_CableTray2 = cableTrayConnect2.m_CableTrayId; for (auto elbow : cableTrayCount) { CableTray3T.m_elbowsConnected.push_back(elbow); } mElecDataSet[iter->first].m_ElecCableTray3Ts.push_back(CableTray3T); } //两边都有弯头 四通 else if (cableTrayCount.size() == 3) { CString str = dmtl.NewGuid(); DwgElecCableTray4T CableTray4T; CableTray4T.m_CableTray4TID = str; CableTray4T.m_CableTray1 = cableTrayConnect1.m_CableTrayId; CableTray4T.m_CableTray2 = cableTrayConnect2.m_CableTrayId; for (auto elbow : cableTrayCount) { CableTray4T.m_elbowsConnected.push_back(elbow); } mElecDataSet[iter->first].m_ElecCableTray4Ts.push_back(CableTray4T); } } //寻找三通四通的其他几个相连接的桥架 vector<pair<double, DwgElecCableTray>> vClosetCableTrayS4T1, vClosetCableTrayE3T, vClosetCableTrayE4T1, vClosetCableTrayS4T2, vClosetCableTrayE4T2; for (auto iter3T = mElecDataSet[iter->first].m_ElecCableTray3Ts.begin(); iter3T != mElecDataSet[iter->first].m_ElecCableTray3Ts.end(); iter3T++) { vector<pair<double, DwgElecCableTray>> vClosetCableTrayS3T; for (auto line : m_CableTray) { if (line.m_CableTrayId != iter3T->m_CableTray1 && line.m_CableTrayId != iter3T->m_CableTray2&&iter3T->m_elbowsConnected.size() >= 2) { if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[1].startLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[1].startPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[1].startPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[1].endLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[1].endPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[1].endPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[0].startLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[0].startPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[0].startPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[0].endLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[0].endPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[0].endPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS3T.push_back(make_pair(distS, line)); } } } } if (vClosetCableTrayS3T.size() > 0) { sort(vClosetCableTrayS3T.begin(), vClosetCableTrayS3T.end(), FindClosetNum); iter3T->m_CableTray3 = vClosetCableTrayS3T[0].second.m_CableTrayId; } } //if (vClosetCableTrayE3T.size() > 0) //{ // sort(vClosetCableTrayE3T.begin(), vClosetCableTrayE3T.end(), FindClosetNum); // mElecDataSet[iter->first].m_ElecCableTray3Ts[mElecDataSet[iter->first].m_ElecCableTray3Ts.size() - 1].m_CableTray3 = vClosetCableTrayE3T[0].second.m_CableTrayId; //} for (auto iter4T = mElecDataSet[iter->first].m_ElecCableTray4Ts.begin(); iter4T != mElecDataSet[iter->first].m_ElecCableTray4Ts.end(); iter4T++) { for (auto line : m_CableTray) { if (line.m_CableTrayId != iter4T->m_CableTray1 && line.m_CableTrayId != iter4T->m_CableTray2) { if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[0].startLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[0].startPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[0].startPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[0].endLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[0].endPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[0].endPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[1].startLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[1].startPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[1].startPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[1].endLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[1].endPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[1].endPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T1.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[2].startLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[2].startPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[2].startPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T2.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T2.push_back(make_pair(distS, line)); } } if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[2].endLine)) { double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[2].endPoint); double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[2].endPoint); if (distS > distE && distE < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T2.push_back(make_pair(distE, line)); } else if (distS < distE && distS < line.m_CableTrayRadius * 2) { vClosetCableTrayS4T2.push_back(make_pair(distS, line)); } } } } if (vClosetCableTrayS4T1.size() > 0) { sort(vClosetCableTrayS4T1.begin(), vClosetCableTrayS4T1.end(), FindClosetNum); iter4T->m_CableTray3 = vClosetCableTrayS4T1[0].second.m_CableTrayId; } if (vClosetCableTrayS4T2.size() > 0) { sort(vClosetCableTrayS4T2.begin(), vClosetCableTrayS4T2.end(), FindClosetNum); iter4T->m_CableTray4 = vClosetCableTrayS4T2[0].second.m_CableTrayId; } } //寻找不是弯头但互相交叉的三通桥架 //vector<DwgElecCableTray> vNewCableTray; for (auto crossLine : m_CableTray) { for (auto crossedLine : m_CableTray) { geoPoint3d perpPt; double distS, distE; DwgElecCableTray3T unNormal3T; //找不相交但是构成三通的位置 if (crossedLine.m_CableTrayCenterLine.GetPerpPt(crossLine.m_CableTrayCenterLine.startPoint(), perpPt) == 0) { distS = perpPt.DistanceTo(crossLine.m_CableTrayCenterLine.startPoint()); } else if (crossedLine.m_CableTrayCenterLine.GetPerpPt(crossLine.m_CableTrayCenterLine.endPoint(), perpPt) == 0) { distE = perpPt.DistanceTo(crossLine.m_CableTrayCenterLine.endPoint()); } if (distS > distE && distE <= crossLine.m_CableTrayRadius) { unNormal3T.m_CableTray1 = crossLine.m_CableTrayId; unNormal3T.m_CableTray2 = crossedLine.m_CableTrayId; } else if (distS < distE && distS <= crossLine.m_CableTrayRadius) { unNormal3T.m_CableTray1 = crossLine.m_CableTrayId; unNormal3T.m_CableTray2 = crossedLine.m_CableTrayId; } } } //for (auto lines : m_CableTray) //{ // //} // for (auto connectTray : m_CableTray) // { // if (connectTray.m_CableTrayLine1.startPoint().DistanceTo(iter->second.startPoint) < 10 && // connectTray.m_CableTrayLine1.IsParallelWith(iter->second.startLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCount1.push_back(iter->second); // 记录下这个桥架是否还与另外的弯头相连 // for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++) // { // if (iter->first != iterr->first) // { // if (iterr->second.startPoint.DistanceTo(connectTray.m_CableTrayLine2.startPoint) < 10 && // iterr->second.startLine.IsParallelWith(connectTray.m_CableTrayLine2)) // { // } // else if (iterr->second.endPoint.DistanceTo(connectTray.m_CableTrayLine2.startPoint) < 10 && // iterr->second.endLine.IsParallelWith(connectTray.m_CableTrayLine2)) // { // } // } // } // } // else if (connectTray.m_CableTrayLine1.endPoint().DistanceTo(iter->second.startPoint) < 10 && // connectTray.m_CableTrayLine1.IsParallelWith(iter->second.startLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCounts.push_back(iter->second); // for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++) // { // if (iter->first != iterr->first) // { // } // } // } // else if (connectTray.m_CableTrayLine2.startPoint().DistanceTo(iter->second.startPoint) < 10 && // connectTray.m_CableTrayLine2.IsParallelWith(iter->second.startLine)) // { // connectTray.m_CableTrayLine2HasElbow = true; // vElbowCounts.push_back(iter->second); // } // else if (connectTray.m_CableTrayLine2.endPoint().DistanceTo(iter->second.startPoint) < 10 && // connectTray.m_CableTrayLine2.IsParallelWith(iter->second.startLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCounts.push_back(iter->second); // for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++) // { // if (iter->first != iterr->first) // { // } // } // } // else if (connectTray.m_CableTrayLine1.startPoint().DistanceTo(iter->second.endPoint) < 10 && // connectTray.m_CableTrayLine1.IsParallelWith(iter->second.endLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCounts.push_back(iter->second); // } // else if (connectTray.m_CableTrayLine1.endPoint().DistanceTo(iter->second.endPoint) < 10 && // connectTray.m_CableTrayLine1.IsParallelWith(iter->second.endLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCounts.push_back(iter->second); // } // else if (connectTray.m_CableTrayLine2.startPoint().DistanceTo(iter->second.endPoint) < 10 && // connectTray.m_CableTrayLine2.IsParallelWith(iter->second.endLine)) // { // connectTray.m_CableTrayLine1HasElbow = true; // vElbowCounts.push_back(iter->second); // } // else if (connectTray.m_CableTrayLine2.endPoint().DistanceTo(iter->second.endPoint) < 10 && // connectTray.m_CableTrayLine2.IsParallelWith(iter->second.endLine)) // { // connectTray.m_CableTrayLine2HasElbow = true; // vElbowCounts.push_back(iter->second); // } // } // if (vElbowCounts.size() == 2) // { // iter->second.connectLine1 = vElbowCounts[0].startLine; // } //} //mElecDataSet[iter->first].m_ElecCableTrays = m_CableTray; //找到每一个桥架的中心线并截断不规则的桥架线段 /* for (auto tray : m_CableTray) { geoSegLine centerLine; geoPoint3d perPt1, perPt2, perPt3, perPt4; vector<pair<geoPoint3d,geoPoint3d>> perPoints; vector<geoPoint3d> pointsOnLine; //找到两条线的每一条垂足 if (tray.m_CableTrayLine2.GetPerpPt(tray.m_CableTrayLine1.startPoint(), perPt1) == 0) { perPoints.push_back(make_pair(perPt1, tray.m_CableTrayLine1.startPoint())); } else { pointsOnLine.push_back(perPt1); } if (tray.m_CableTrayLine2.GetPerpPt(tray.m_CableTrayLine1.endPoint(), perPt2) == 0) { perPoints.push_back(make_pair(perPt2, tray.m_CableTrayLine1.endPoint())); } else { pointsOnLine.push_back(perPt2); } if (tray.m_CableTrayLine1.GetPerpPt(tray.m_CableTrayLine2.startPoint(), perPt3) == 0) { perPoints.push_back(make_pair(perPt3, tray.m_CableTrayLine2.startPoint())); } else { pointsOnLine.push_back(perPt3); } if (tray.m_CableTrayLine1.GetPerpPt(tray.m_CableTrayLine2.endPoint(), perPt4) == 0) { perPoints.push_back(make_pair(perPt4, tray.m_CableTrayLine2.endPoint())); } else { pointsOnLine.push_back(perPt4); } //两个点说明都是最小值 if (perPoints.size() == 2) { geoPoint3d startPt, endPt; startPt.x = (perPoints[0].first.x + perPoints[0].second.x) / 2; startPt.y = (perPoints[0].first.y + perPoints[0].second.y) / 2; endPt.x = (perPoints[1].first.x + perPoints[1].second.x) / 2; endPt.y = (perPoints[1].first.y + perPoints[1].second.y) / 2; centerLine.Set(startPt, endPt); } //四个点说明是矩形 if (pointsOnLine.size() == 4) { geoPoint3d startPt, endPt; if (tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.startPoint()) > tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.endPoint())) { startPt.x = (tray.m_CableTrayLine1.startPoint().x + tray.m_CableTrayLine2.endPoint().x) / 2; startPt.y = (tray.m_CableTrayLine1.startPoint().y + tray.m_CableTrayLine2.endPoint().y) / 2; endPt.x = (tray.m_CableTrayLine1.endPoint().x + tray.m_CableTrayLine2.startPoint().x) / 2; endPt.y = (tray.m_CableTrayLine1.endPoint().y + tray.m_CableTrayLine2.startPoint().y) / 2; } else if (tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.startPoint()) < tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.endPoint())) { startPt.x = (tray.m_CableTrayLine1.startPoint().x + tray.m_CableTrayLine2.startPoint().x) / 2; startPt.y = (tray.m_CableTrayLine1.startPoint().y + tray.m_CableTrayLine2.startPoint().y) / 2; endPt.x = (tray.m_CableTrayLine1.endPoint().x + tray.m_CableTrayLine2.endPoint().x) / 2; endPt.y = (tray.m_CableTrayLine1.endPoint().y + tray.m_CableTrayLine2.endPoint().y) / 2; } centerLine.Set(startPt, endPt); } //直角梯形 if (perPoints.size() == 1 && pointsOnLine.size() == 3) { geoPoint3d startPt, endPt; startPt.x = (perPoints[0].first.x + perPoints[0].second.x) / 2; startPt.y = (perPoints[0].first.y + perPoints[0].second.y) / 2; vector<geoPoint3d> realPoints; for (auto point : pointsOnLine) { if (point.DistanceTo(tray.m_CableTrayLine1.startPoint()) < 10 || point.DistanceTo(tray.m_CableTrayLine1.endPoint()) < 10 || point.DistanceTo(tray.m_CableTrayLine2.startPoint()) < 10 || point.DistanceTo(tray.m_CableTrayLine2.endPoint()) < 10) { realPoints.push_back(point); } } if (realPoints.size() >= 2) { endPt.x = (realPoints[0].x + realPoints[1].x) / 2; endPt.y = (realPoints[0].y + realPoints[1].y) / 2; } centerLine.Set(startPt, endPt); } tray.m_CableTrayCenterLine = centerLine; } */ //分析三通,四通和弯头 //for (auto mutliTray : m_CableTray) //{ // for (auto temp : m_CableTray) // { // if () // { // } // } //} }
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值