#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def test_coordinate_conversion():
    """测试坐标转换"""
    
    print("=== 坐标转换测试 ===\n")
    
    # 假设窗口大小
    window_width = 800
    window_height = 600
    
    print(f"窗口大小: {window_width} x {window_height}")
    print("\n测试不同位置的坐标转换:")
    
    test_points = [
        # (屏幕坐标, 描述)
        ((0, 0), "左上角"),
        ((window_width/2, window_height/2), "中心点"),
        ((window_width, window_height), "右下角"),
        ((window_width/4, window_height/4), "左上象限"),
        ((3*window_width/4, 3*window_height/4), "右下象限"),
        ((419, 96), "用户点击的位置"),  # 来自之前的日志
    ]
    
    for (screen_x, screen_y), description in test_points:
        # 方法1：标准转换（我们当前使用的）
        normalized_x1 = (2.0 * screen_x / window_width) - 1.0
        normalized_y1 = 1.0 - (2.0 * screen_y / window_height)
        
        # 方法2：简单转换
        normalized_x2 = (screen_x / window_width) * 2 - 1
        normalized_y2 = 1 - (screen_y / window_height) * 2
        
        # 方法3：不反转Y轴
        normalized_x3 = (2.0 * screen_x / window_width) - 1.0
        normalized_y3 = (2.0 * screen_y / window_height) - 1.0
        
        print(f"\n{description}: 屏幕坐标({screen_x:.0f}, {screen_y:.0f})")
        print(f"  方法1 (当前): ({normalized_x1:.3f}, {normalized_y1:.3f})")
        print(f"  方法2 (等价): ({normalized_x2:.3f}, {normalized_y2:.3f})")
        print(f"  方法3 (不反转Y): ({normalized_x3:.3f}, {normalized_y3:.3f})")
        
        # 验证是否在有效范围内
        in_range1 = -1 <= normalized_x1 <= 1 and -1 <= normalized_y1 <= 1
        in_range3 = -1 <= normalized_x3 <= 1 and -1 <= normalized_y3 <= 1
        
        print(f"  方法1 在范围内: {in_range1}")
        print(f"  方法3 在范围内: {in_range3}")

def test_qt_coordinate_precision():
    """测试Qt坐标精度问题"""
    print("\n=== Qt坐标精度测试 ===")
    
    # 模拟真实的Qt widget大小（来自日志）
    qt_width = 1238.0
    qt_height = 725.0
    
    # 模拟真实的点击位置（来自日志）
    click_x = 615
    click_y = 237
    
    print(f"Qt Widget大小: {qt_width} x {qt_height}")
    print(f"点击位置: ({click_x}, {click_y})")
    
    # 当前的转换方法
    normalized_x = (2.0 * click_x / qt_width) - 1.0
    normalized_y = 1.0 - (2.0 * click_y / qt_height)
    
    print(f"归一化坐标: ({normalized_x:.6f}, {normalized_y:.6f})")
    
    # 验证屏幕中心
    center_x = qt_width / 2
    center_y = qt_height / 2
    
    center_norm_x = (2.0 * center_x / qt_width) - 1.0
    center_norm_y = 1.0 - (2.0 * center_y / qt_height)
    
    print(f"屏幕中心: ({center_x}, {center_y}) -> ({center_norm_x:.6f}, {center_norm_y:.6f})")
    
    # 分析点击位置相对于中心的偏移
    offset_from_center_x = click_x - center_x
    offset_from_center_y = click_y - center_y
    
    print(f"相对于中心的偏移: ({offset_from_center_x:.1f}, {offset_from_center_y:.1f})")
    
    # 计算归一化偏移
    norm_offset_x = offset_from_center_x / (qt_width / 2)
    norm_offset_y = -offset_from_center_y / (qt_height / 2)  # Y轴反转
    
    print(f"归一化偏移: ({norm_offset_x:.6f}, {norm_offset_y:.6f})")
    
    # 预期的归一化坐标（从中心偏移）
    expected_norm_x = norm_offset_x
    expected_norm_y = norm_offset_y
    
    print(f"预期归一化坐标: ({expected_norm_x:.6f}, {expected_norm_y:.6f})")
    
    # 比较
    diff_x = abs(normalized_x - expected_norm_x)
    diff_y = abs(normalized_y - expected_norm_y)
    
    print(f"坐标差异: X={diff_x:.6f}, Y={diff_y:.6f}")

def test_panda3d_coordinate_systems():
    """测试Panda3D的坐标系统"""
    print("\n=== Panda3D坐标系统 ===")
    print("屏幕坐标系统:")
    print("  Qt:       左上角(0,0), 右下角(w,h), Y轴向下")
    print("  Panda3D:  左下角(-1,-1), 右上角(1,1), Y轴向上")
    print()
    print("3D世界坐标系统:")
    print("  X轴: 向右为正")
    print("  Y轴: 向前为正（远离相机）")
    print("  Z轴: 向上为正")
    print()
    print("相机坐标系统:")
    print("  X轴: 向右为正")
    print("  Y轴: 向前为正（相机朝向）")
    print("  Z轴: 向上为正")

def test_coordinate_alignment_issue():
    """测试坐标对齐问题"""
    print("\n=== 坐标对齐问题分析 ===")
    
    qt_width = 1238.0
    qt_height = 725.0
    
    print("测试不同位置的归一化坐标:")
    
    test_positions = [
        ("左边缘", 50, qt_height/2),
        ("右边缘", qt_width-50, qt_height/2),
        ("上边缘", qt_width/2, 50),
        ("下边缘", qt_width/2, qt_height-50),
        ("左上角", 100, 100),
        ("右下角", qt_width-100, qt_height-100),
        ("中心", qt_width/2, qt_height/2),
        ("用户点击", 615, 237)
    ]
    
    for name, x, y in test_positions:
        # 当前方法
        norm_x = (2.0 * x / qt_width) - 1.0
        norm_y = 1.0 - (2.0 * y / qt_height)
        
        # 期望：点击边缘应该接近±1，点击中心应该接近0
        # 左边缘应该接近-1，右边缘应该接近+1
        # 上边缘应该接近+1，下边缘应该接近-1
        
        expected_x = (x - qt_width/2) / (qt_width/2)
        expected_y = (qt_height/2 - y) / (qt_height/2)
        
        print(f"{name:8s}: 实际({norm_x:6.3f}, {norm_y:6.3f})  期望({expected_x:6.3f}, {expected_y:6.3f})")

if __name__ == "__main__":
    test_coordinate_conversion()
    test_qt_coordinate_precision()
    test_panda3d_coordinate_systems()
    test_coordinate_alignment_issue() 