无法从线性函数中获得正确的坐标

如何解决无法从线性函数中获得正确的坐标

我现在正在做的是将贝塞尔曲线和线的 100 个坐标点重新组合成一条折线,为此,我试图使用数学来生成放置在 1 个起点和起点之间的线上的点的坐标1 个终点。

问题是我得到了正确的 y 值、高于预期的 y 值和低于预期的 y 值,具体取决于直线上的情况(贝塞尔曲线工作正常),这是我现在的代码:

import pygame
from pygame import gfxdraw
from random import randint
from win32api import GetSystemMetrics
from time import time
import math
import numpy as np

width = GetSystemMetrics(0)
height = GetSystemMetrics(1)

def generate_original_points_coordinates(circle_size_px):
    generating = True
    while generating:
        x = randint(0,width)
        y = randint(0,height)
        if y < height-circle_size_px and y > circle_size_px and x < width-circle_size_px and x > circle_size_px:
            points.append([x,y])
            generating = False

def generate_points_coordinates(count,spacing,circle_size_px):
    for i in range(0,count-1):
        generating = True
        while generating:
            x = points[-1][0]+randint(-spacing,spacing)
            y = points[-1][1]+randint(-spacing,spacing)
            if y < height-circle_size_px and y > circle_size_px and x < width-circle_size_px and x > circle_size_px: 
                generating = False
                points.append([x,y])
        
def generate_original_and_p(count,circle_size_px):
    generate_original_points_coordinates(circle_size_px)
    generate_points_coordinates(count,circle_size_px)
    return points

running = True
while running:
    pygame.font.init()
    font = pygame.font.SysFont('freesansbold.ttf',32)
    text = font.render('NotBezier',True,(0,255))
    points = []
    gen_points = generate_original_and_p(9,800,234)
    size = [width,height]
    screen = pygame.display.set_mode(size,32)
    screen.fill((33,33,33))
    curve = []
    # Draw bezier curves from points in a list
    for i in range(0,len(gen_points)-2):
        dist_s = math.sqrt(math.pow(gen_points[i+2][0]-gen_points[i][0],2)+math.pow(gen_points[i+2][1]-gen_points[i][1],2))
        dist_x = gen_points[i+2][0] - gen_points[i][0]
        dist_y = gen_points[i+2][1] - gen_points[i][1]
        if dist_s < 234/2:
            line = []
            print(dist_s)
            gfxdraw.line(screen,gen_points[i][0],gen_points[i][1],gen_points[i+2][0],gen_points[i+2][1],255))
            m = (gen_points[i][1] - gen_points[i+2][1]) / (gen_points[i][0] - gen_points[i+2][0])
            b = np.linalg.norm(np.diff([gen_points[i],gen_points[i+2]],axis=0),axis=1).tolist()[0]
            for ratio in np.linspace(0,1,10):
                print("ratio = "+str(ratio)+",m = "+str(m)+",b = "+str(b)+",dist_x = "+str(dist_x)+",dist_y = "+str(dist_y))
                line.append([gen_points[i][0]+(ratio * dist_x),gen_points[i][1] + (m * (ratio * dist_y) + b)])
            curve.append(line)
        if i+2 == len(gen_points)-1:
            gfxdraw.filled_circle(screen,5,255,0))
            screen.blit(font.render(str(i+2),0)),(gen_points[i+2][0],gen_points[i+2][1]+10))
        gfxdraw.filled_circle(screen,0))
        screen.blit(font.render(str(i),(gen_points[i][0],gen_points[i][1]+10))

    pygame.display.flip()

    # Place points on such curves and lines

    print(gen_points)
    print(curve)
    print(len(curve))
    i = input("quit?: ")
    pygame.display.quit()
    if i == "quit":
        running = False

这是点 [[1059,559],[1472,684],[1090,509]] 的示例列表

这是创建行时的示例输出:

ratio = 0.0,m = -1.6129032258064515,b = 58.83026432033091,dist_x = 31,dist_y = -50
ratio = 0.1111111111111111,dist_y = -50
ratio = 0.2222222222222222,dist_y = -50
ratio = 0.3333333333333333,dist_y = -50
ratio = 0.4444444444444444,dist_y = -50
ratio = 0.5555555555555556,dist_y = -50
ratio = 0.6666666666666666,dist_y = -50
ratio = 0.7777777777777777,dist_y = -50
ratio = 0.8888888888888888,dist_y = -50
ratio = 1.0,dist_y = -50

# Points on screen

[
    [807,333],[1205,526],[1257,373],[1039,507],[724,834],[626,765],[1059,509]
]

# Coordinate of the 10 points located on that line and spaced by 10%

[
    [
         [1059.0,617.8302643203309],[1062.4444444444443,626.7908377970334],[1065.888888888889,635.7514112737359],[1069.3333333333333,644.7119847504384],[1072.7777777777778,653.6725582271409],[1076.2222222222222,662.6331317038434],[1079.6666666666667,671.593705180546],[1083.111111111111,680.5542786572485],[1086.5555555555557,689.514852133951],[1090.0,698.4754256106535]
     ]
]

如您所见,使用此函数的 y 横坐标高于预期,这只是许多情况中的一个案例。

是否知道导致此问题的原因以及如何解决?

TL:DR -> 使用 thisis 函数 https://pastebin.com/xgNLQiVt 在某些情况下获得不正确的 y 值

解决方法

猜猜 50K+ 提供某个函数的用法很复杂,因为我知道我也在我的代码中使用了 numpy,我找到了另一种方法来获得我想要的东西:

#  Generate 1000 x coordinates / Generate 1000 y coordinates

list_x,list_y = np.linspace(Points[i][0],Points[i+2][0],1000),np.linspace(Points[i][1],Points[i+2][1],1000)

#  Generate a list of coordinates out of list_x and list_y

line = [[list_x[i],list_y[i]] for i in range(1000)]

而且可能有一种更简单、更短的方法,我不知道获得相同的东西

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-