You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码生成星形而非圆形求助:圆周均匀分布300个黑点异常

问题解决:圆周均匀分布黑点变成星形的修复方案

你加载图像转换为灰度图并缩放至700×700后,尝试在图像中心的圆周上均匀分布300个黑点,但最终黑点形成星形而非圆形。问题出在黑点坐标的计算逻辑上,以下是修复后的代码及说明:

错误原因分析

  1. 计算黑点坐标时,仅算出了相对于圆心的偏移量,未加上图像中心的实际坐标(sx, sy),导致所有点围绕原点(0,0)分布,而非图像中心(350,350)
  2. 绘制大圆的循环可以简化,原代码中int(sy*2)和int(sx*2)等价于s=700,直接使用s更清晰

修复后的代码

from PIL import Image
import numpy as np
import math

Img = Image.open(r"C:\TMP\Lily1.jpg")  # 用原始字符串避免路径转义问题
Img = Img.convert("L")
s = 700
Img = Img.resize((s, s), resample=Image.Resampling.BILINEAR)
Img = np.array(Img)

def Show(arr):
    Img = Image.fromarray(arr, "L")
    Img.show()

def Dis(x1, y1, x2, y2):
    return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5

nNails = 300
sx = s / 2  # 图像中心x坐标
sy = s / 2  # 图像中心y坐标
radius = s * 0.5 - 5
Canvas = np.array(Img, copy=True)

# 绘制中心大圆
for a in range(s):
    for b in range(s):
        if Dis(sx, sy, b, a) < radius:
            Canvas[a, b] = 255

nailPos = []
for a in range(nNails):
    radAngle = (360 / nNails) * a * (math.pi / 180)
    # 计算相对于中心的偏移,再加上中心坐标得到实际位置
    xcor = sx + math.cos(radAngle) * radius 
    ycor = sy + math.sin(radAngle) * radius
    nailPos.append([xcor, ycor])

# 绘制黑点
for pos in nailPos:
    # numpy数组索引为[行, 列],对应图像的[y, x]坐标
    Canvas[round(pos[1]), round(pos[0])] = 0

Show(Canvas)

关键修复点

  • 在计算xcor和ycor时,分别加上图像中心坐标sx和sy,确保点围绕图像中心分布
  • 优化路径写法,用原始字符串避免转义错误
  • 简化大圆绘制的循环范围,直接使用s替代冗余计算

内容的提问来源于stack exchange,提问作者Sigurd09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:42:43