《最强大脑第九季》C#手撸傅立叶残影题目

2023-10-31

在最新一季的最强大脑总决赛中,有一个比赛项目《傅立叶残影》感觉印象深刻。原理就是五根针首尾相连,按照自身的转速和杆长运动,根据提供的每根杆的转速和杆长来判断出尾部运动的残影轨迹。原理比较简单,就是一个连杆运行。好吧,知道原理就可以动手开始撸代码了。

在这里插入图片描述

开发的语言是C#的,目前只使用了三个杆,主要使用的前台代码是:
    <StackPanel Orientation="Vertical">
        <Grid Width="400" Height="400">
            <Grid Width="400" Height="400">
                <Line X1="{Binding x0}" Y1="{Binding y0}" X2="{Binding x1}" Y2="{Binding y1}" Stroke="Purple" StrokeThickness="3"/>
                <Line X1="{Binding x1}" Y1="{Binding y1}" X2="{Binding x2}" Y2="{Binding y2}" Stroke="Blue" StrokeThickness="3"/>
                <Line X1="{Binding x2}" Y1="{Binding y2}" X2="{Binding x3}" Y2="{Binding y3}" Stroke="Red" StrokeThickness="3"/>
            </Grid>
            <Grid Width="400" Height="400" Background="Transparent"  x:Name="gggg">
                //绘制运行轨迹
            </Grid>
        </Grid>
        <StackPanel Orientation="Horizontal">
            <Button Content="开始" Click="Button_Click" Width="50" Height="50"></Button>
            <Button Content="复位" Click="Button_Click_1" Width="50" Height="50"/>
            <Button Content="暂停" Click="Button_Click_2"  Width="50" Height="50"/>
            <UniformGrid Rows="2" Width="50">
                <TextBlock Text="a半径"/>
                <TextBox Text="{Binding r0}"/>
            </UniformGrid>
            <UniformGrid Rows="2">
                <TextBlock Text="b半径" Width="50"/>
                <TextBox Text="{Binding r1}"/>
            </UniformGrid>
            <UniformGrid Rows="2">
                <TextBlock Text="c半径" Width="50"/>
                <TextBox Text="{Binding r2}"/>
            </UniformGrid>

            <UniformGrid Rows="2" Width="25">
                <TextBlock Text="a速度"/>
                <TextBox Text="{Binding s0}"/>
            </UniformGrid>
            <UniformGrid Rows="2">
                <TextBlock Text="b速度" Width="25"/>
                <TextBox Text="{Binding s1}"/>
            </UniformGrid>
            <UniformGrid Rows="2">
                <TextBlock Text="c速度" Width="25"/>
                <TextBox Text="{Binding s2}"/>
            </UniformGrid>
        </StackPanel>

    </StackPanel>
后端的核心代码是:
        bool isRun = false;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            isRun = true;

            Thread t = new Thread(() =>
            {
                int i = 0;
                double xOld = double.NaN;
                double yOld = double.NaN;
                while (isRun)
                {
                    Helper.HelpDisplay.Invoke(() =>
                    {
                        mModel.x1 = mModel.x0 + mModel.r0 * Math.Cos(mModel.angle0 * Math.PI / 180);
                        mModel.y1 = mModel.y0 + mModel.r0 * Math.Sin(mModel.angle0 * Math.PI / 180);
                    });
                    if (i % mModel.s0 == 0)
                    {
                        mModel.angle0++;
                        if (mModel.angle0 >= 360)
                        {
                            mModel.angle0 = 0;
                        }
                    }
                    Helper.HelpDisplay.Invoke(() =>
                    {
                        mModel.x2 = mModel.x1 + mModel.r1 * Math.Cos(mModel.angle1 * Math.PI / 180);
                        mModel.y2 = mModel.y1 + mModel.r1 * Math.Sin(mModel.angle1 * Math.PI / 180);
                    });
                    if (i % mModel.s1 == 0)
                    {
                        mModel.angle1++;
                        if (mModel.angle1 >= 360)
                        {
                            mModel.angle1 = 0;
                        }
                    }
                    Helper.HelpDisplay.Invoke(() =>
                    {
                        mModel.x3 = mModel.x2 + mModel.r2 * Math.Cos(mModel.angle2 * Math.PI / 180);
                        mModel.y3 = mModel.y2 + mModel.r2 * Math.Sin(mModel.angle2 * Math.PI / 180);
                    });
                    if (i % mModel.s2 == 0)
                    {
                        mModel.angle2++;
                        if (mModel.angle2 >= 360)
                        {
                            mModel.angle2 = 0;
                        }
                    }
                    if (!double.IsNaN(xOld))
                    {
                        Helper.HelpDisplay.Invoke(() =>
                        {
                            Line l = new Line();
                            l.X1 = xOld;
                            l.Y1 = yOld;
                            l.X2 = mModel.x3;
                            l.Y2 = mModel.y3;
                            l.StrokeThickness = 1;
                            l.Stroke = Brushes.Black;

                            gggg.Children.Add(l);
                        });

                    }
                    xOld = mModel.x3;
                    yOld = mModel.y3;
                    i++;
                    Thread.Sleep(10);
                }
            });
            t.IsBackground = true;
            t.Start();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            isRun = false;
            Thread.Sleep(100);
            mModel.angle0 = 90;
            mModel.angle1 = 90;
            mModel.angle2 = 90;

            gggg.Children.Clear();

            mModel.x1 = mModel.x0 + mModel.r0 * Math.Cos(mModel.angle0 * Math.PI / 180);
            mModel.y1 = mModel.y0 + mModel.r0 * Math.Sin(mModel.angle0 * Math.PI / 180);

            mModel.x2 = mModel.x1 + mModel.r1 * Math.Cos(mModel.angle1 * Math.PI / 180);
            mModel.y2 = mModel.y1 + mModel.r1 * Math.Sin(mModel.angle1 * Math.PI / 180);

            mModel.x3 = mModel.x2 + mModel.r2 * Math.Cos(mModel.angle2 * Math.PI / 180);
            mModel.y3 = mModel.y2 + mModel.r2 * Math.Sin(mModel.angle2 * Math.PI / 180);
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            isRun = !isRun;
        }
开发结束实现的运行效果,如下图:

在这里插入图片描述

开发过程中遇见的问题1:

最开始写的是每个杆运行对应一个线程互相独立,但是写出来之后发现,由于三个线程互相独立,无法实现时间上的完美同步,绘制的曲线没有规律可言。发现这个问题之后,采用单线程轮询扫描的方法,实现了一下运动的准确效果。

开发过程中遇见的问题2:

计算sin(30)时,赋值错误。C#中math.sin(value)的value是弧度的意思,不是角度。角度转弧度的计算公式是:2πr/360n/r=nπ/180。所以根据数学中sin(n)转换为C#语言算法是:Math.Sin(n * Math.PI / 180)

源码下载地址:

https://download.csdn.net/download/sdfjasad/86086513

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《最强大脑第九季》C#手撸傅立叶残影题目 的相关文章

随机推荐

  • 如何利用小程序打造私域流量池,实现粉丝经济增长

    随着电商行业的发展 私域流量运营已成为新趋势 小程序已成为私域流量运营的重要组成部分 本文将探讨如何利用小程序打造私域流量池 实现粉丝经济增长 一 私域流量池的定义 私域流量池指企业拥有的用户数据 社群和平台 通过私域流量池 企业可以更好地
  • 数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

    主从复制 主从复制 主要是针对MySQL数据库的高可用性 容灾性上面 是叫做高可用性 高可用性可以简单的理解为容灾性 稳定性 针对故障 风险情况下的处理 备案 策略 指系统无中断地执行其功能的能力 代表系统的可用性程度 高可用性通常通过提高
  • Docker 实践(九):生产环境优化

    系列文章第五篇中介绍了线上生产环境使用 Docker 集群 这篇文章对原来的架构进行了优化 同时使用了 Docker 最新的一些特性 记录一些流水账 CentOS CentOS 和 Docker 确实不搭 但是苦于做不了主 只能硬着头皮上了
  • 【从零开始的Java开发】2-9-3 油画商城静态网页案例

    文章目录 项目展示 项目 0 准备工作 1 页眉区的制作 1 1 logo和menu位置的摆放 1 2 menu功能的实现 1 3 menu功能的样式 1 4 登录与注册 1 5 小结 2 正文区的制作 2 1 页眉和banner区 2 2
  • Android Dialog用法

    摘要 创建对话框 一个对话框一般是一个出现在当前Activity之上的一个小窗口 处于下面的Activity失去焦点 对话框接受所有的用户交互 对话框一般用于提示信息和与当前应用程序直接相关的小功能 Android API 支持下列类型 创
  • 什么是结构因果模型

    结构因果模型 结构因果模型简介 定义 历史 因果关系之梯 关联 干预 反事实 因果 因果和相关 类型 必要因 充分因 促成因 模型 因果图 模型元素 连接方式 链 叉 对撞 节点类型 中介变量 混杂因子 工具变量 孟德尔随机化 关联 独立性
  • linux内核编程入门之proc文件读写

    my proc dir proc create myproc 0666 NULL proc ops 在 proc 根目录下创建文件myproc 文件的权限为0666 文件的读写操作定位在proc ops中 具体可以看下面源码 可以使用 ec
  • 蜂群算法论文【matlab代码与仿真】

    一 算法流程 蜂群算法 Bee Algorithm 是一种启发式优化算法 灵感来源于蜜蜂在寻找食物和选择巢穴的行为 这种算法模拟了蜜蜂群体中的集体智能 用于解决各种优化问题 蜂群算法的基本思想是通过模拟蜜蜂的搜索行为来寻找最优解 算法中的蜜
  • 仙境传说RO:添加自定义道具

    仙境传说RO 添加自定义道具 大家好 我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具 在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点 那么让我们直接进入正题开始操作 此处我们讲的过程中以红色药水举例 喜欢的可以
  • php弹窗一次,网站广告弹出层(每天弹出一次)

    网站广告弹出层 每天弹出一次 可以有两种做法 一 是标识符存入数据库 二 利用Jquery cookie 我这里做的是比较简单的用到的知识是Jquery cookie 这里要注意的一点是jquery cookie的值 火狐能够获取 IE 3
  • VMware桥接模式无法识别英特尔AX200无线网卡解决办法

    1 先到英特尔网站下载最新驱动 更新网卡驱动适用于 Intel 无线网络卡的 Windows 10 和 Windows 11 Wi Fi 驱动程序 2 到控制面板查看无线网卡属性是否有下图组件 没有的话 依次操作 安装 服务 添加 从磁盘安
  • Unidbg系列--Ollvm字符串解密

    Ollvm字符串解密 原理 使用unidbg框架 模拟调用So文件 并Hook内存写操作 当so解密操作写入内存时 回调获取解密字符串 并将其写入新so文件中 达到反OLLVM字符串加密的目的 解密脚本 package com xCrack
  • openmvs编译

    OpenMVG 和OpenMVS在Widows下使用Vs2019编译 black world 博客园 cnblogs com cmake src G Visual Studio 16 2019 A x64 DCMAKE TOOLCHAIN
  • pyspark-ml学习笔记:模型评估

    问题是这样的 如果我们想基于pyspark开发一个分布式机器训练平台 那么肯定需要对模型进行评估 而pyspark本身自带模型评估的api很少 想进行扩展的话有几种方案 1 使用udf自行编写代码进行扩展 2 使用现有的 像sklearn中
  • CentOS安装Docker

    Docker是一个开源的容器引擎 它有助于更快地交付应用 Docker可将应用程序和基础设施层隔离 并且能将基础设施当作程序一样进行管理 使用 Docker可更快地打包 测试以及部署应用程序 并可以缩短从编写到部署运行代码的周期 CentO
  • 相机标定实战之双目标定

    相机标定原理 文章目录 相机标定原理 前言 一 采集图像 二 基于Matlab单双目标定流程 采集棋盘图 三 基于OpenCV Python双目标定流程 检测棋盘格角点 对角点进行亚像素精细化 单目标定 双目标定 双目校正 保存标定参数 读
  • 服务器系统怎么设置第一启动项,服务器怎么设置启动项

    服务器怎么设置启动项 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 您需要在源端服务器上安装迁移Agent并且输入目的端
  • java: 非法字符: ‘\ufeff‘解决方法

    出现问题 在使用idea时候会出现java 非法字符 ufeff 这样的情况 原因 出现这样的问题来源于这个BOM 一般在编写时候会给你默认添加这样的一个BOM头 是隐藏起来的 编译时候会给出现编码混乱问题 详见了解BOM 隐藏字符 百度百
  • 三调与二调图斑叠加分析,筛选不同地类面积占比,筛选举证图斑

    主要步骤 标识数据 叠加分析 用标识 生成所有相交图斑 属性有原图斑的地类和国家的地类 以及原图斑的面积 生成的面域 增加4个字段 图斑的三调一级类 图斑的国家NYYPDL 是否相同 标识后的图斑面积 转换三调地类为二调的一级类 转换国家地
  • 《最强大脑第九季》C#手撸傅立叶残影题目

    在最新一季的最强大脑总决赛中 有一个比赛项目 傅立叶残影 感觉印象深刻 原理就是五根针首尾相连 按照自身的转速和杆长运动 根据提供的每根杆的转速和杆长来判断出尾部运动的残影轨迹 原理比较简单 就是一个连杆运行 好吧 知道原理就可以动手开始撸