从集合中获取坐标的组合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_1017097573/article/details/87566982
import java.util.*;

public class Test {
    public static void main(String[] args) {
        LinkedHashSet<Long> set = new LinkedHashSet<Long>();


        set.add(1L);
        set.add(3L);
        set.add(4L);
        set.add(5L);
        set.add(6L);
        set.add(10L);






        List<Long[]> pointArray = getPointArray(set,1,10);

        for(Long[] arr:pointArray){
            System.out.println("("+arr[0]+","+arr[1]+")");
        }
    }

    /**
     * 获取 有效坐标的集合,这些有效坐标 是指 从左边界 到 右边界规定的界限中,排除了set集合中包含的坐标点的剩余段的坐标
     * @param set 排除的坐标点集合
     * @param leftBorder 左边界坐标点
     * @param rightBorder 右边界坐标点
     * @return (左坐标,右左标)集合
     */
    private static List<Long[]> getPointArray(LinkedHashSet<Long> set,long leftBorder,long rightBorder){
        List<Long[]> pointsList = new LinkedList<Long[]>();//返回坐标点的集合

        Iterator<Long> iterator = set.iterator();
        long leftPoint = -1L;//组成坐标的左坐标点  -1表示空
        long rightPoint = -1L;//组成坐标的右坐标点  -1表示空

        long firstPoint = -1L;//记录从set中遍历的第一个坐标点
        long lastPoint = -1L;//记录从set中遍历的最后一个坐标点

        while(iterator.hasNext()){
            if(leftPoint == -1){//左标点为空,说明是刚开始扫描set
                leftPoint = iterator.next();
                firstPoint = leftPoint;
            }else{
                rightPoint = iterator.next();
            }

            if(rightPoint != -1L){//右坐标点不为空,说明此时有一对有效的的坐标点
                if(leftPoint != rightPoint && leftPoint<rightPoint-1){
                    pointsList.add(new Long[]{leftPoint+1,rightPoint-1});
                }
                leftPoint = rightPoint;
                rightPoint = -1L;
            }


        }

        lastPoint = leftPoint;//初始化lastPoint

        if(set.size()>0){
            if(lastPoint != rightBorder){
                pointsList.add(new Long[]{lastPoint+1,rightBorder});
            }
            if(firstPoint != leftBorder ){
                pointsList.add(0,new Long[]{leftBorder,firstPoint-1});
            }
        }else{
            pointsList.add(0,new Long[]{leftBorder,rightBorder});
        }





        return pointsList;
    }
}

 

展开阅读全文

关于坐标的问题

03-15

在VC+DirectX3D做的程序中,当我用rnCD3DMesh->Create( m_pd3dDevice, _T(".x") ) rn 的方法加载x格式的静止的3d模型后,可以用rnD3DXMatrixLookAtLH( &D3DXMATRIX, &D3DXVECTOR3, rn &D3DXVECTOR3, rn &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );rn m_pd3dDevice->SetTransform( D3DTS_WORLD, &D3DXMATRIX );rn的方法定义和改变该3D模型在“世界”中的位置,rnrn但是,当我用rn DXUtil_FindMediaFile( TCHAR*, _T(".x") );rn LoadMeshHierarchy(); //DXSDK中SKinned Mesh中定义的函数rn if( m_pdeHead != NULL)rn m_ArcBall.SetRadius( m_pdeHead->fRadius );rnrn的方法加载一个带动画的3D模型时,该用什么函数定义该3D模型在“世界”中的位置呢?rn/////////////////////////////////////////////////////////////////rnRender()rnrn hr = m_pDevice->SetTransform(D3DTS_WORLD,&mTrans); rn//WORLD是以“世界”为参照吧?rn if(FAILED(hr))rn return hr;rn pdeCur = m_pdeHead;rn while (pdeCur != NULL)rn rn D3DXMatrixTranslation(&mTrans, -pdeCur->vCenter.x, -pdeCur->vCenter.y, -pdeCur->vCenter.z);rn D3DXMatrixIdentity(&mCur);rnrn hr = UpdateFrames(pdeCur->pframeRoot, mCur);rn if (FAILED(hr))rn return hr;rn hr = DrawFrames(pdeCur->pframeRoot, cTriangles);rn if (FAILED(hr))rn return hr;rnrn pdeCur = pdeCur->pdeNext;rnrn/////////////////////////////////////////////////////////////////rn我是照抄DXSDK中SKinned Mesh例子中的代码,并将D3DTS_VIEW改成D3DTS_WORLD,加入我的程序后该3D模型出现在“世界”的坐标原点,哪个函数控制着它的坐标值?我看在DolphinVS例子中,那条rn海豚的位置好像是由这些函数控制的:rn D3DXMATRIX matDolphin, matTrans, matRotate1, matRotate2;rn D3DXMatrixScaling( &matDolphin, 0.01f, 0.01f, 0.01f );rn D3DXMatrixRotationZ( &matRotate1, -cosf(fKickFreq)/6 );rn D3DXMatrixMultiply( &matDolphin, &matDolphin, &matRotate1 );rn D3DXMatrixRotationY( &matRotate2, fPhase );rn D3DXMatrixMultiply( &matDolphin, &matDolphin, &matRotate2 );rn D3DXMatrixTranslation( &matTrans, -5*sinf(fPhase), sinf(fKickFreq)/2, 10-10*cosf(fPhase) );rn D3DXMatrixMultiply( &matDolphin, &matDolphin, &matTrans );rn但我有点看不明白,那位高手给我指点一下?非常感谢!rnrn rnrnrnrn 论坛

没有更多推荐了,返回首页