C#根据起点和终点构建出一条连续的线段


前言

没有找到合适的方法。

一、前景

根据起点和终点构建出一条连续的线段,而分线段集合是乱序的,并不是1-2,2-3,3-4有序的,所以需要在乱序的分线段中构建成一条有序的线段,可以是正向的,也可以是反向的。

二、使用步骤

1.新建Condition类和Line类

代码如下(示例):

class Condition
{
    /// <summary>
    /// 起点
    /// </summary>
    public string Start { get; set; }
    /// <summary>
    /// 终点
    /// </summary>
    public string Stop { get; set; }
}

class Line
{
    /// <summary>
    /// 起点
    /// </summary>
    public string StartId { get; set; }
    /// <summary>
    /// 终点
    /// </summary>
    public string StopId { get; set; }
}

2.编写算法

代码如下(示例):

/// <summary>
/// 输入起点和终点,返回起点到终点连接的一条线段。
/// </summary>
/// <param name="lines">乱序的分线段集合</param>
/// <param name="conditions">查询条件集合</param>
/// <returns></returns>
public static List<string> GetLinesByStartAndStop(List<Line> lines, List<Condition> conditions)
{
    List<string> result = new List<string>();
    if (lines.Count <= 0) return null;
    foreach (var item in conditions)
    {
        string startId = item.Start;
        string endId = item.Stop;
        //循环次数 
        int count = lines.Count;
        if (count <= 0) continue;

        List<string> childResult = new List<string>();

        //若起始点和终止点都为空,那么就是整条线段。
        if (string.IsNullOrEmpty(startId) && string.IsNullOrEmpty(endId))
        {
            foreach (var enroute in lines)
            {
                childResult.Add($"{enroute.StartId}-{enroute.StopId}");
            }
            result.AddRange(childResult);
            continue;
        }

        //一段线段的查到直接插入返回
        var startIdAndEndId = lines.FirstOrDefault(p => p.StartId == startId && p.StopId == endId);
        if (startIdAndEndId != null)
        {
            result.Add($"{startIdAndEndId.StartId}-{startIdAndEndId.StopId}");
            continue;
        }
        var endIdAndStartId = lines.FirstOrDefault(p => p.StartId == endId && p.StopId == startId);
        if (endIdAndStartId != null)
        {
            result.Add($"{endIdAndStartId.StartId}-{endIdAndStartId.StopId}");
            continue;
        }


        //多段线段
        bool isReverse = false;//是否反向
        //先正向找,找不到终点清空数据,再反向找,反向找不到终点也清空数据
        {
            //第一种情况,正向查;开始点在StartId上,结束点在EndID上。
            var first = lines.FirstOrDefault(p => p.StartId == startId);
            if (first == null)
            {
                isReverse = true;
            }
            else
            {
                childResult.Add($"{first.StartId}-{first.StopId}");
                string tempId = first.StopId;
                for (int i = 0; i < count; i++)
                {
                    var second = lines.FirstOrDefault(p => p.StartId == tempId);
                    if (second == null)
                    {
                        isReverse = true;
                        childResult.Clear();
                        break;
                    }
                    tempId = second.StopId;
                    childResult.Add($"{second.StartId}-{second.StopId}");
                    if (second.StopId.Trim() == endId.Trim()) break;
                }
            }
        }
        if (isReverse)
        {
            //第二种情况,反向查;开始点在StopId上,结束点在StartId上。
            var first = lines.FirstOrDefault(p => p.StopId == startId);
            if (first != null)
            {
                childResult.Add($"{first.StopId}-{first.StartId}");
                string tempId = first.StartId;
                for (int i = 0; i < count; i++)
                {
                    var second = lines.FirstOrDefault(p => p.StopId == tempId);
                    if (second == null)
                    {
                        childResult.Clear();
                        break;
                    }
                    tempId = second.StartId;
                    childResult.Add($"{second.StopId}-{second.StartId}");
                    if (second.StartId.Trim() == endId.Trim()) break;
                }
            }

        }

        result.AddRange(childResult);
    }
    return result;
}

3.如何使用

static void Main(string[] args)
{

    List<Line> lines = new List<Line>();
    lines.Add(new Line() { StartId = "2", StopId = "3" });
    lines.Add(new Line() { StartId = "5", StopId = "6" });
    lines.Add(new Line() { StartId = "4", StopId = "5" });
    lines.Add(new Line() { StartId = "3", StopId = "4" });
    lines.Add(new Line() { StartId = "1", StopId = "2" });

    List<Condition> conditions = new List<Condition>();
    conditions.Add(new Condition { Start = "1", Stop = "6" });
    conditions.Add(new Condition { Start = "6", Stop = "1" });


    var result = GetLinesByStartAndStop(lines, conditions);
    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

}

总结

使用此方法可以快速的得出正向或反向的连续线段,当然线段在这里仅仅是个例子,也可以是其他对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在WinForm中,可以使用Graphics对象进行线段的绘制。首先,你需要创建一个继承自抽象基类DrawObject的类,并重写其Draw方法来实现线段的绘制。在Draw方法中,你可以使用Graphics对象的DrawLine方法来线段。DrawLine方法需要传入起点终点的坐标。例如,你可以使用以下代码来一条线段: ```csharp public class LineObject : DrawObject { public Point StartPoint { get; set; } public Point EndPoint { get; set; } public override void Draw(Graphics g) { base.Draw(g); using(Pen pen = new Pen(Color.Black)) { g.DrawLine(pen, StartPoint, EndPoint); } } } // 在你的绘图区域或控件上实例化LineObject并设置起点终点坐标 LineObject line = new LineObject(); line.StartPoint = new Point(10, 10); line.EndPoint = new Point(100, 100); // 调用line.Draw方法进行绘制 line.Draw(yourGraphicsObject); ``` 这样,你就可以在WinForm中一条线段了。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* [winform使用Graphics进行线段、圆、椭圆、铅笔、多边形等绘制功能完整代码](https://download.csdn.net/download/bashendixie5/85271518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C# winform 设置chart折线中指定点/线段的颜色](https://blog.csdn.net/weixin_41952656/article/details/132182091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* *4* [winform 根据两点求线上所有点及线](https://blog.csdn.net/weixin_33909059/article/details/93811182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值