檔案外形計算

#include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct outline_struct { double min[3]; double max[3]; ProMdl model; ProMatrix matrix; } outline_struct; typedef struct surf_tesselate_struct { int face_id; double corner1[3]; double corner2[3]; double corner3[3]; } surf_tesselate_struct; //Copy a vector to another double *ProUtilVectorCopy( double from[3], double to[3]) { if(from == NULL) to[0] = to[1] = to[2] = 0.0; else { to[0] = from[0]; to[1] = from[1]; to[2] = from[2]; } return(to); } //Transform a 3d point by a matrix void ProUtilPointTrans( double m[4][4], double p[3], double output[3]) { double buff[4]; ProError status; if(m == NULL) { ProUtilVectorCopy(p, output); return; } status = ProPntTrfEval(p, m, buff); ProUtilVectorCopy(buff, output); } 7 // draw outline as wireframe ProError draw_outline_wireframe(ProVector min,ProVector max) { ProVector vec; vec[0]=min[0]; vec[1]=min[1]; vec[2]=min[2]; ProGraphicsPenPosition(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[0] = min[0]; ProGraphicsLineDraw(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[0] = min[0]; ProGraphicsLineDraw(vec); vec[0]=min[0]; vec[1]=min[1]; vec[2]=min[2]; ProGraphicsPenPosition(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = max[1]; ProGraphicsLineDraw(vec); vec[2] = min[2]; ProGraphicsLineDraw(vec); vec[0] = max[0]; ProGraphicsLineDraw(vec); vec[2] = max[2]; ProGraphicsLineDraw(vec); vec[1] = min[1]; ProGraphicsLineDraw(vec); vec[2] = min[2]; ProGraphicsLineDraw(vec); return PRO_TK_NO_ERROR; } 7 // Copy one matrix to another, or initialize a matrix to be the unitary matrix void ProUtilMatrixCopy( double input[4][4], double output[4][4]) { int i,j; if(input == NULL) { for(i=0;i<4;i++) { for(j=0;j<4;j++) { output[i][j] = 0.0; } } output[0][0] = 1.0; output[1][1] = 1.0; output[2][2] = 1.0; output[3][3] = 1.0; } else { for(i=0;i<4;i++) { for(j=0;j<4;j++) { output[i][j] = input[i][j]; } } } } 7 // Find the inverse of a transformation matrix int ProUtilMatrixInvert( double m[4][4], double output[4][4]) { double vec[3], scale_sq, inv_sq_scale; int i,j; //If the matrix is null, return the identity matrix if(m == NULL) { ProUtilMatrixCopy(NULL, output); return(1); } //Obtain the matrix scale vec[0] = m[0][0]; vec[1] = m[0][1]; vec[2] = m[0][2]; scale_sq = vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]; //Check whether there is an inverse, and if not, return 0 if(scale_sq < (.000000001 * .000000001)) return(0); //Need the inverse scale squared inv_sq_scale = 1.0 / scale_sq; //The orientation vectors for(j=0;j<3;j++) { for(i=0;i<3;i++) { output[j][i] = m[i][j] * inv_sq_scale; } output[j][3] = 0.0; } // The shift vectors for(i=0;i<3;i++) { output[3][i] = 0.0; for(j=0;j<3;j++) { output[3][i] -= m[i][j] * m[3][j] * inv_sq_scale; } } output[3][3] = 1.0; return(1); } ProError ModelOutlineCompute(ProMdl model, double *modelLength = NULL) { ProError err; // 初始化 outline_struct get_outline; get_outline.max[0]=-100000; get_outline.max[1]=-100000; get_outline.max[2]=-100000; get_outline.min[0]=+100000; get_outline.min[1]=+100000; get_outline.min[2]=+100000; ProMatrix rel_matrix={ {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }; // 獲取默認坐標系的矩陣 ProSelection sel_outline_csys; char outline_csys_def[PRO_NAME_SIZE] = "PRT_M_CENTER"; ProName csys_def_name; ProStringToWstring(csys_def_name, outline_csys_def); ProModelitem csys_gi; err = ProModelitemByNameInit(model, PRO_CSYS, csys_def_name, &csys_gi); if (err == PRO_TK_NO_ERROR) { ProGeomitemdata *p_csys_daten; err = ProGeomitemdataGet(&csys_gi,&p_csys_daten); if (err!=PRO_TK_NO_ERROR) { return PRO_TK_USER_ABORT; } err = ProMatrixInit(p_csys_daten->data.p_csys_data->x_vector, p_csys_daten->data.p_csys_data->y_vector, p_csys_daten->data.p_csys_data->z_vector, p_csys_daten->data.p_csys_data->origin, rel_matrix); err = ProGeomitemdataFree(&p_csys_daten); } // 通過曲面特徵計算檔案的外形 ProSurfaceTessellationData *tes_data = NULL; err = ProPartTessellate((ProPart)model,0.1,0,PRO_B_FALSE,&tes_data); int i, j, SurfCount =0; ProSurface outlineSurfs[6]; err=ProArraySizeGet((ProArray)tes_data, &SurfCount); if (err != PRO_TK_NO_ERROR || SurfCount < 1) { return err; } ProSrftype surfType; // 先將曲面排序,首先計算圓柱面 ProSurfaceTessellationData *cylSurfData = NULL; ProSurfaceTessellationData *notCysSurfData = NULL; err = ProArrayAlloc(0, sizeof(ProSurfaceTessellationData), 1, (ProArray*)&cylSurfData); err = ProArrayAlloc(0, sizeof(ProSurfaceTessellationData), 1, (ProArray*)&notCysSurfData); for (i = 0; i < SurfCount; ++i) { err = ProSurfaceTypeGet(tes_data[i].surface, &surfType); if (surfType == PRO_SRF_CYL) { err = ProArrayObjectAdd((ProArray*)&cylSurfData, -1, 1, &tes_data[i]); } else { err = ProArrayObjectAdd((ProArray*)&notCysSurfData, -1, 1, &tes_data[i]); } } int cylSurfCount = 0; err = ProArraySizeGet((ProArray)cylSurfData, &cylSurfCount); for (i = 0; i < cylSurfCount; ++i) { tes_data[i] = cylSurfData[i]; } for (i = 0; i < SurfCount - cylSurfCount; ++i) { tes_data[i + cylSurfCount] = notCysSurfData[i]; } //int face_id=0; for(i=0; i get_outline.max[0]) { get_outline.max[0]=transformed[0]; outlineSurfs[0] = tes_data[i].surface; } if(transformed[1]>get_outline.max[1]) { get_outline.max[1]=transformed[1]; outlineSurfs[1] = tes_data[i].surface; } if(transformed[2]>get_outline.max[2]) { get_outline.max[2]=transformed[2]; outlineSurfs[2] = tes_data[i].surface; } if(transformed[0] data.p_surface_data->srf_shape.cylinder.radius <= check_radius) { continue; } check_radius = surfData->data.p_surface_data->srf_shape.cylinder.radius; ProUtilPointTrans(rel_matrix,surfData->data.p_surface_data->srf_shape.cylinder.origin,virtual_center); ProVector surfNormal; ProUtilVectorCopy(surfData->data.p_surface_data->srf_shape.cylinder.e3, surfNormal); if (fabs(surfNormal[0] - rel_matrix[0][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[0][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[0][2]) < cyl_comp_tolerance) { axis_id = 0; } else if (fabs(surfNormal[0] + rel_matrix[0][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[0][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[0][2]) < cyl_comp_tolerance) { axis_id = 0; } else if (fabs(surfNormal[0] - rel_matrix[1][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[1][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[1][2]) < cyl_comp_tolerance) { axis_id = 1; } else if (fabs(surfNormal[0] + rel_matrix[1][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[1][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[1][2]) < cyl_comp_tolerance) { axis_id = 1; } else if (fabs(surfNormal[0] - rel_matrix[2][0]) < cyl_comp_tolerance && fabs(surfNormal[1] - rel_matrix[2][1]) < cyl_comp_tolerance && fabs(surfNormal[2] - rel_matrix[2][2]) < cyl_comp_tolerance) { axis_id = 2; } else if (fabs(surfNormal[0] + rel_matrix[2][0]) < cyl_comp_tolerance && fabs(surfNormal[1] + rel_matrix[2][1]) < cyl_comp_tolerance && fabs(surfNormal[2] + rel_matrix[2][2]) < cyl_comp_tolerance) { axis_id = 2; } } } } if(axis_id!=-1) { is_cylinder=1; for(i=0; i
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值